如何防止位于 Javascript HREF 属性的 XSS?

How to prevent against XSS located in Javascript HREF attribute?

<a href='javascript:do_something("<?php echo $untrusted_input; ?>");'>Test</a>
<script>
    function do_something(str) {
        //...
    }
</script>

我想知道如何编码变量 $untrusted_input(例如在 PHP 中)以避免执行 XSS(javascript 注入)?

在这种情况下,htmlspecialchars 函数是不安全的,因为它将注入的 " 替换为 &quot;,但 HTML 解析器仍会解释 [=16] =] 作为有效的 ":

如果您尝试此代码,您将看到显示的警报:

<a href='javascript:do_something("&quot;+alert(&quot;injected&quot;)+&quot;");'>Test 4</a>
<script>
    function do_something(str) {
        //...
    }
</script>

并且addslashes函数也是不安全的,因为它在'"之前添加了斜线但没有对&quot;进行编码,因此可以使用上面的例子。

请注意,我是作为一名网络安全研究人员提出这个问题的,我想知道我们可以轻松解决这个问题的方法?作为开发人员,我从来不这样做。

谢谢,

您可以使用 meta-tag 并将 content-security-policy 设置为禁止内联 javascript:

<meta http-equiv="Content-Security-Policy" content="script-src 'self'">

有关详细信息,请参阅 CSP