首页 > 解决方案 > 如何防止位于 Javascript HREF 属性中的 XSS?

问题描述

<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 解析器仍会将 解释&quot;为有效的"

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

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

并且该addslashes函数也是不安全的,因为它在之前添加了斜杠'并且"不进行编码&quot;,因此可以使用上面的示例进行转义。

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

谢谢,

标签: javascriptphpxss

解决方案


您可以使用元标记并将您的 content-security-policy 设置为禁止内联 javascript:

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

有关详细信息,请参阅CSP


推荐阅读