例如,我有一个包含此内容的php脚本:
<?php
$msg = addslashes("I'm a message. The what happened >:(");
echo "<script>alert($msg); return false;</script>";
?>
但警报被最后一个打破“(”。我怎么解决这个问题?
答案 0 :(得分:6)
您应该在alert
参数中加上引号:
echo "<script>alert('$msg'); return false;</script>";
您的代码输出到浏览器的是:
<script>alert(The what happened >:(); return false;</script>
这不是一个有效的javascript,在引用之后,它变为:
<script>alert('The what happened >:('); return false;</script>
这是有效的javascript。
答案 1 :(得分:2)
你需要将它放在一个JavaScript字符串中,否则会被解释为这样,这是没有意义的并导致错误:
<script>alert(The what happened >:(); return false;</script>
注意alert()
调用中的单引号表示JavaScript字符串(双引号也可用):
<?php
$msg = "The what happened >:(";
echo "<script>alert('$msg'); return false;</script>";
?>
使用htmlspecialchars()
来逃避内部内容以缓解XSS也是一个好主意。
答案 2 :(得分:2)
其他答案是沿着右边的行,但是仅仅在字符串周围加上引号是不够的,如果它可以是任意字符串。如果字符串本身包含引号,反斜杠或换行符,则会破坏JavaScript字符串文字。如果字符串包含</script
(或在某些情况下仅包含</
),则会导致<script>
块中断。在任何一种情况下,如果涉及用户提供的输入,那么会为您提供一个很大的旧的跨站点脚本安全漏洞。
虽然对于$msg
的特定值可能不需要它,但是习惯于将JS-string-literal-evcaping输出到JS字符串中的任何文本都是一个好主意。虽然您可以通过添加反斜杠手动执行此操作,但通常使用内置的JSON编码器会更容易,它可以用于其他类型,如数组和对象以及字符串。
<script type="text/javascript">
alert(<?php echo json_encode($msg); ?>);
return false; // huh? return, in a <script> block??
</script>
答案 3 :(得分:0)
根据具体情况,您可能也会这样做:
<?php
$msg = "The what happened >:(";
?>
<script>alert("<?php echo $msg ?>"); return false;</script>
如果不需要回显HTML或JavaScript代码,则不要这样做。它更容易维护。
答案 4 :(得分:0)
alert()
接受字符串参数;你必须用引号(单引号或双引号)将你传递给它的文本括起来,并确保字符串中的任何匹配引号都被反斜杠转义。
在你的情况下,单引号就足够了:
echo "<script>alert('$msg'); return false;</script>";