【问题标题】:Escape brackets on php for javascript用于javascript的php上的转义括号
【发布时间】:2011-04-08 07:29:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: php javascript encoding decoding


    【解决方案1】:

    您应该用引号将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。

    【讨论】:

    • 非常感谢,但现在我得到“未终止的字符串文字”,并且我在 php msg 中有 addlashes()。
    • 您需要添加引号:alert('$msg');addslashes 所做的是将其参数中出现的引号(反斜杠)转义,即将I'm a message. The what happened &gt;:( 更改为I\'m a message. The what happened &gt;:(,但不会用引号括起来。
    • 我在 alert() 中添加了引号。但它仍然不起作用,我得到“未终止的字符串文字”。
    • 你能用最新的 php 代码更新问题吗?以及你的 html 源输出。
    • @Sein Kraft 但是您在上面的代码中仍然有 alert($msg); 而不是 alert('$msg');
    【解决方案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 也是一个好主意。

    【讨论】:

    • 双引号也可以,但请记住将它们转义,因为字符串由双引号分隔。 +1 用于 XSS 警告,尽管当 OP 使用静态字符串时无需担心。
    • 是的,这只是一个友好的警告 :)
    • 虽然htmlspecialchars() 是错误的转义类型,以包含在&lt;script&gt; 块中的JS 字符串文字中,该块在HTML 中有CDATA 内容(XHTML 的故事有点复杂)。如果它是 HTML 属性中的 JS 字符串文字,则需要 JS 字符串编码,后跟 htmlspecialchars() 以及(或者,更容易避免在 PHP 5.3 中使用 JSON_HEX_TAG|AMP|QUOT)。
    【解决方案3】:

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

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

    <script type="text/javascript">
        alert(<?php echo json_encode($msg); ?>);
        return false; // huh? return, in a <script> block??
    </script>
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

        <?php
            $msg = "The what happened >:(";
        ?>
        
        <script>alert("<?php echo $msg ?>"); return false;</script>
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-20
          • 1970-01-01
          • 2017-01-26
          • 2011-06-27
          • 2012-02-16
          • 2012-10-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多