用于javascript的php上的转义括号

时间:2010-09-04 19:58:30

标签: php javascript encoding decoding

例如,我有一个包含此内容的php脚本:

<?php
$msg = addslashes("I'm a message. The what happened >:(");
echo "<script>alert($msg); return false;</script>";
?>

但警报被最后一个打破“(”。我怎么解决这个问题?

5 个答案:

答案 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>";