HTML编码是否会阻止XSS安全漏洞?

时间:2010-02-25 14:53:34

标签: xss escaping

只需转换以下内容(“大5”):

& -> &
< -> &lt;
> -> &gt;
" -> &#034;
' -> &#039;

你会阻止XSS攻击吗?

我认为您也需要在字符级别使用白名单,以防止certain attacks,但following answer表示它会使问题过于复杂。

编辑page个详细信息it does not prevent more elaborate injections, does not help with "out of range characters = question marks" when outputting Strings to Writers with single byte encodings, nor prevents character reinterpretation when user switches browser encoding over displayed page.从本质上讲,只是逃避这些字符似乎是一种非常天真的方法。

3 个答案:

答案 0 :(得分:9)

  

你会阻止XSS攻击吗?

如果您在正确的时间(*)执行此操作,那么是的,您将阻止HTML注入。这是最常见的XSS攻击形式。这不仅仅是一个安全问题,你还是需要进行转义,以便具有这些字符的字符串无论如何都能正确显示。安全问题是正确性问题的一个子集。

  

我认为你也需要在角色级别上列出白名单,以防止某些攻击

没有。 HTML转义会将每个攻击呈现为页面上的非活动纯文本,这就是您想要的。该页面上的攻击范围展示了进行HTML注入的不同方法,这可以解决一些服务器部署的愚蠢的“XSS过滤器”,以防止常见的HTML注入攻击。这表明“XSS过滤器”本质上是漏洞和无效的。

还有其他形式的XSS攻击可能会或可能不会影响您,例如用户提交的URI上的错误方案(javascript:等),将代码注入数据回显到JavaScript块(您所在的位置)需要JSON样式的转义)或者样式表或HTTP响应标题(同样,当你将文本放到另一个上下文中时,你总是需要适当的编码形式;如果你看到像PHP的{{1}这样的未转义插值的东西,你应该总是怀疑})。

然后是文件上传处理,Flash原始策略,旧版浏览器中的UTF-8超长序列以及应用程序级内容生成问题;所有这些都可能导致跨站点脚本。但HTML注入是每个Web应用程序将面临的主要问题,而且大多数PHP应用程序今天都出错了。

(*:将文本内容插入到HTML中,而不是在其他时间。在脚本开头的"string $var string" / $_POST中不要使用HTML转义表单提交数据;这是一个常见的错误的错误。)

答案 1 :(得分:5)

答案 2 :(得分:4)

计数器度量取决于插入数据的上下文。如果将数据插入HTML,则使用转义序列(即字符引用)替换HTML元字符会阻止插入HTML代码。

但是如果您在另一个上下文中(例如,被解释为URL的HTML属性值),您必须处理具有不同转义序列的其他元字符。