我遇到了一个涉及逃避角色的问题,我认为这根本不简单。如果这是在javascript中完成的,没什么好说的,但上下文是使用echo命令(在PHP中)编写这样的javascript代码:
echo "<script>document.getElementById('spanID').innerHTML=\"$x\"</script>";
$ x是PHP环境中的变量,可以包含单引号和双引号。我在这里做的是: 1.保持$ x不变,如果$ x包含任何双引号,上面的代码将无效,回显的文字可能如下:
<script>document.getElementById('spanID').innerHTML="leftside"rightside"</script>;
我认为$ x = leftside“在右边,你可以看到它肯定不起作用。
转义$ x中的双引号(全部更改为
"),然后回显的文字可能如下所示:
的document.getElementById( 'spanID')的innerHTML = “莱夫特赛德
"rightside”;
"将不会转换为“当它被分配给Span的innerHTML属性时(例如),所以我的SPAN的innerHTML应该是leftside而不是我想要的”在右边,它将是左侧
"左侧。
如果我改变原始回声中的“to”,就像这样:
echo "<script>document.getElementById('spanID').innerHTML='$x'</script>";
它是相同的,因为这里的$ x可以包含单引号和双引号。
在这种情况下,我没有找到任何其他方法来逃避引号。你能帮帮我吗?
谢谢!
答案 0 :(得分:2)
您需要在引号之间放置一个字符串,该字符串是包含有效(且安全)HTML的有效JavaScript字符串。
您最好的选择是不使用innerHTML
而是使用document.createTextNode
,这意味着您只需要斜线转义内容。
否则,您需要HTML转义,然后斜杠转义内容。为了正确,你的斜线转义函数应至少转义为双引号,反斜杠和所有JavaScript换行符(U + A,U + D,U + 2028,U + 2029)。我相信PHP addslashes
默认不处理U + 2028或U + 2029,但How to escape string from PHP for javascript?有其他选择。
把它们放在一起:
$x_escaped = json_encode($x, JSON_HEX_TAG);
echo "<script>document.getElementById('spanID').appendChild(document.createTextNode($x_escaped))</script>"
应该这样做。 JSON_HEX_TAG确保$x_escaped
不会包含</script>
或过早结束脚本标记的任何其他内容。 </script>
将成为\u003c/script\u003e
。