【问题标题】:how to prevent XSS in javascript string如何防止javascript字符串中的XSS
【发布时间】:2017-09-01 06:48:13
【问题描述】:

假设我有这样的事情:

<script>
var string = '<?= $_GET['var'] ?>';
</script>

为了防止 XSS,我想确保单引号被转义。 addslashes 可以做到这一点,但人们仍然可以通过将 $_GET['var'] 设置为 来突破。例如。

<script>
var string = '</script><script>alert(/test/)</script>';
</script>

也许我应该转义(使用\)单引号和&lt;?这就是我需要逃脱的全部吗?

我想像这样的攻击现在更难了,因为浏览器经常禁止运行显示在 GET 字符串中的代码,但我仍然认为这是应该受到保护的东西。

【问题讨论】:

标签: javascript php xss


【解决方案1】:

<script>
var string = <?= json_encode($_GET['var']) ?>;
</script>

不带引号。

【讨论】:

  • htmlspecialchars 仍然需要 &lt;&gt; 但我认为这是最好的答案。好吧,由于json_encode 添加了它们,因此不应出现周围的字符串定界符(在这种情况下为单引号)。
  • @neubert,关于 html 标记的 htmlspecialchars。刚刚对 phpfiddle 做了一个快速测试,似乎 json_encode() 负责这一点。虽然它只转义了注入的&lt;/script&gt; 标记中的反斜杠,但检查 DOM,浏览器似乎很好。所以我更担心 htmlspecialchars 可能会改变字符串,从而改变它的含义。
  • json_encode($_GET['var'], JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS) 已提交对答案的编辑。
  • 如果没有JSON_HEX_* ,以下攻击是可能的:&lt;?php $_GET['var'] = " '&gt;&lt;a href=/test&gt;click me&lt;!--"; ?&gt; &lt;div onmouseover='x = &lt;?php echo json_encode($_GET['var']) ?&gt;'&gt;&lt;/div&gt;
  • @VasiliyZverev 感谢您指出这一点,我又学到了一些我不知道的东西,但我认为这不适用于提出的实际问题。
【解决方案2】:
<script>
var string = <?= json_encode($_GET['var'], JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS) ?>;
</script>

请注意,不需要引号。 json_encode() 产生带引号的字符串 "bla-bla-bla"。 参数JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS"&lt;&gt;&amp;' 转换为十六进制,如\u003C。这有助于在 JS 内联时对抗 XSS:

<?php
    $_GET['var'] = " '><a href=/test>click me<!--";
?>
<div onmouseover='x = <?= json_encode($_GET['var'], JSON_HEX_QUOT | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS) ?>'></div>

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2016-03-26
    相关资源
    最近更新 更多