set msg [format hello%cnworld 0x5C] ;# codepoint 0x5C is backslash
puts $msg ;# prints "hello\nworld"
# Show the hex values of all the bytes of the UTF-8 string
# to prove that the sequence "\n" (0x5C 0x6E) is in the value
puts [regexp -all -inline .. [binary encode hex [encoding convertto utf-8 $msg]]]
2条答案
按热度按时间7y4bm7vi1#
你可以对反斜杠进行转义,如:
字符串
然后打印$B
4bbkushb2#
如果文字字符序列
\n
在变量中,则将使用puts
打印输出-输出值时不执行替换。反斜杠替换(这是将2个字符序列\n
转换为代码点10:linefeed的原因)仅在解析Tcl脚本中的文字值时发生;除非给出-nobackslashes
,否则由subst
命令执行,并由带引号的字符串中的expr
命令执行(或将其参数视为表达式的其他命令:if
,while
,for
等)。字符串
如果你从用户那里接收到一个包含序列
\n
的字符串,但它显示为一个换行符,那么你几乎肯定有一个远程代码执行漏洞(由用户提交的值经过一个解析和替换阶段引起的,这可能包括脚本替换-用户提供的任何代码都将运行)。检查没有大括号引号的表达式,eval
s等。