0

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

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

但是警报被最后一个“(”打破了。我该如何解决这个问题?

4

5 回答 5

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。

于 2010-09-04T20:00:16.307 回答
2

其他答案是正确的,如果字符串可以是任意字符串,仅在字符串周围加上引号是不够的。如果字符串本身包含引号、反斜杠或换行符,则会破坏 JavaScript 字符串文字。如果字符串包含</script(或仅</在某些情况下)会破坏<script>块。在任何一种情况下,如果涉及用户提供的输入,就会给您带来一个很大的旧跨站点脚本安全漏洞。

虽然对于 的这个特定值您可能不需要它$msg,但最好习惯于 JS-string-literal-escaping 您输出到 JS 字符串中的任何文本。虽然您可以通过添加反斜杠手动执行此操作,但使用内置 JSON 编码器通常更容易,它适用于其他类型,如数组和对象以及字符串。

<script type="text/javascript">
    alert(<?php echo json_encode($msg); ?>);
    return false; // huh? return, in a <script> block??
</script>
于 2010-09-04T20:15:55.087 回答
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().

于 2010-09-04T20:00:39.567 回答
0

根据上下文,您也可以这样做:

<?php
    $msg = "The what happened >:(";
?>

<script>alert("<?php echo $msg ?>"); return false;</script>

如果不需要回显 HTML 或 JavaScript 代码,则不要这样做。它更容易维护。

于 2010-09-04T20:02:22.010 回答
0

alert()接受一个字符串参数;您必须将传递给它的文本括在引号中(单引号或双引号),并确保字符串中的任何匹配引号都被反斜杠转义。

在您的情况下,单引号就足够了:

echo "<script>alert('$msg'); return false;</script>";
于 2010-09-04T20:02:24.630 回答