HTML编码会阻止各种XSS攻击吗?

时间:2008-09-10 10:03:09

标签: security xss html-encode

我并不担心其他类型的攻击。只想知道HTML Encode是否可以防止各种XSS攻击。

即使使用了HTML Encode,还有办法进行XSS攻击吗?

10 个答案:

答案 0 :(得分:87)

没有

不考虑允许某些标签(不是问题的重点)的主题,HtmlEncode并不能涵盖所有XSS攻击。

例如,考虑服务器生成的客户端javascript - 服务器将htmlencoded值直接动态输出到客户端javascript中,htmlencode 不会停止注入脚本执行。

接下来,请考虑以下伪代码:

<input value=<%= HtmlEncode(somevar) %> id=textbox>

现在,如果不是很明显,如果somevar(当然是由用户发送)设置为

a onclick=alert(document.cookie)

结果输出

<input value=a onclick=alert(document.cookie) id=textbox>

这显然有用。显然,这可能(几乎)任何其他脚本......而HtmlEncode也无济于事。

还有一些额外的载体需要考虑......包括第三种XSS,称为基于DOM的XSS(其中恶意脚本是在客户端上动态生成的,例如基于#值)。

另外,不要忘记UTF-7类型的攻击 - 攻击类似于

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-

没有什么可以编码...

当然,解决方案(除了正确且限制性的白名单输入验证)之外,还要执行上下文相关编码:如果您输出的是上下文IS HTML,则HtmlEncoding很棒,或者也许你需要JavaScriptEncoding,或VBScriptEncoding,或AttributeValueEncoding,或......等。

如果您使用的是MS ASP.NET,则可以使用Anti-XSS Library,它提供了所有必要的上下文编码方法。

请注意,所有编码不应仅限于用户输入,还应包括数据库,文本文件等中存储的值。

哦,不要忘记在HTTP标头和META标签中明确设置字符集,否则你仍然会有UTF-7漏洞......

更多信息,以及非常明确的清单(不断更新),请查看RSnake的备忘单:http://ha.ckers.org/xss.html

答案 1 :(得分:9)

如果您在显示之前系统地对所有用户输入进行编码,则表示您是安全的您仍然不是100%安全。
(有关详细信息,请参阅@ Avid的帖子)

此外,当您需要让某些标记取消编码时出现问题,以便您允许用户发布图像或粗体文本或任何需要将用户输入的功能处理为(或转换为)联合国 - 编码标记。

你必须建立一个决策系统来决定哪些标签是允许的,哪些标签不是,并且总有可能找到让非允许标签通过的方法。

如果您在输出未处理的用户数据(静态输入)时,通过警告/不编译来遵循Joel的Making Wrong Code Look Wrongyour language helps you的建议,这会有所帮助。

答案 2 :(得分:3)

如果您对所有内容进行编码。 (取决于您的平台和htmlencode的实现)但是任何有用的Web应用程序都非常复杂,很容易忘记检查它的每个部分。或者第三方组件可能不安全。或者也许你编写的一些代码路径没有这样做,所以你忘了它在其他地方。

所以你可能也想检查输入端的东西。您可能想要检查从数据库中读取的内容。

答案 3 :(得分:1)

正如其他人所提到的,只要您在显示所有用户输入之前编码它就是安全的。这包括从数据库中检索到的所有请求参数和数据,可以通过用户输入进行更改。

作为mentioned by Pat,您有时会想要显示一些标签,而不是所有标签。一种常见的方法是使用标记语言,如TextileMarkdownBBCode。但是,即使是标记语言也容易受到XSS的攻击,只需注意即可。

# Markup example
[foo](javascript:alert\('bar'\);)

如果您决定让“安全”标签通过我会建议找一些现有的库来解析&amp;在输出之前清理代码。在您的消毒剂相当安全之前,您必须检测到a lot of XSS vectors

答案 4 :(得分:1)

我第二个metavida建议找到第三方库来处理输出过滤。中和HTML字符是阻止XSS攻击的好方法。但是,用于转换元字符的代码很容易受到逃避攻击;例如,如果它没有正确处理Unicode和国际化。

一个典型的简单错误自制输出过滤器使得只能捕获&lt;和&gt;,但是会遗漏像“,这可能会破坏用户控制的输出到HTML标记的属性空间,其中Javascript可以附加到DOM。

答案 5 :(得分:1)

不,只是编码常见的HTML令牌并不能完全保护您的网站免受XSS攻击。例如,请参阅google.com中发现的此XSS漏洞:

http://www.securiteam.com/securitynews/6Z00L0AEUE.html

此类漏洞的重要之处在于攻击者能够使用UTF-7对其XSS有效负载进行编码,如果您未在页面上指定不同的字符编码,则用户的浏览器可以解释UTF- 7有效载荷并执行攻击脚本。

答案 6 :(得分:0)

我想建议HTML Purifier(http://htmlpurifier.org/)它不只是过滤html,它基本上是标记化并重新编译它。它真正具有工业实力。

它还有一个额外的好处,即允许您确保有效的html / xhtml输出。

也是纺织品,它是一个很棒的工具,我一直都在使用它,但我也会通过html净化器运行它。

我认为你不明白我的意思是什么。 HTML Purifier不只是'过滤',它实际上重建了html。 http://htmlpurifier.org/comparison.html

答案 7 :(得分:0)

您需要检查的另一件事是您的输入来自哪里。您可以使用referrer字符串(大多数时间)来检查它是否来自您自己的页面,但是在表单中放入隐藏的随机数或某些内容然后检查它(可能使用会话集变量)也有助于了解输入来自您自己的网站,而不是某些网上诱骗网站。

答案 8 :(得分:-1)

我不相信。 Html Encode将所有功能字符(可以被浏览器解释为字符的字符)转换为实体引用,这些实体引用无法被浏览器解析,因此无法执行。

&lt;script/&gt;

浏览器无法执行上述操作。

**除非他们是浏览器中的错误。*

答案 9 :(得分:-1)

myString.replace(/<[^>]*>?/gm, '');

我用过,然后成功。 Strip HTML from Text JavaScript