我不担心其他类型的攻击。我只想知道HTML编码是否可以防止各种XSS攻击。
即使使用HTML编码,也有办法进行XSS攻击吗?
发布于 2008-09-16 07:57:39
不是的。
抛开允许某些标签的问题不谈(这不是问题的重点),HtmlEncode根本没有涵盖所有的XSS攻击。
例如,考虑服务器生成的客户端javascript -服务器动态地将htmlencode值直接输出到客户端javascript中,htmlencode将不会阻止注入的脚本执行。
接下来,考虑以下伪代码:
<input value=<%= HtmlEncode(somevar) %> id=textbox>现在,如果不是很明显,例如,如果将某些事件(当然是由用户发送的)设置为
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-没有什么可编码的.
当然,解决方案(除了适当和限制性的白名单输入验证之外)是执行context-sensitive编码:如果您的输出上下文是HTML,或者您可能需要JavaScriptEncoding、VBScriptEncoding或AttributeValueEncoding,或者...等。
如果你使用的是MS ASP.NET,你可以使用他们的反XSS库,它提供了所有必要的上下文编码方法。
请注意,所有编码都不应仅限于用户输入,还应存储来自数据库、文本文件等的值。
哦,别忘了在HTTP头和元标记中显式地设置字符集,否则仍然会有UTF-7漏洞……
更多信息,以及一个非常明确的列表(不断更新),请查看RSnake的小抄:http://ha.ckers.org/xss.html
发布于 2008-09-10 10:16:14
如果你对所有东西都进行编码,它就会。(取决于您的平台和htmlencode的实现),但任何有用的web应用程序都是如此复杂,以至于很容易忘记检查它的每个部分。或者可能是第三方组件不安全。也可能是你认为编码的某个代码路径没有做到这一点,所以你把它忘在别的地方了。
所以你可能也想检查输入端的东西。您可能想要检查从数据库中读取的内容。
发布于 2008-09-10 11:45:18
正如其他人所提到的,只要在显示所有用户输入之前对其进行编码,您就是安全的。这包括可以通过用户输入更改的所有请求参数和从数据库检索的数据。
作为mentioned by Pat,你有时会想要显示一些标签,而不是所有的标签。一种常见的方法是使用Textile、Markdown或BBCode等标记语言。但是,即使是标记语言也可能容易受到XSS的攻击,请注意。
# Markup example
[foo](javascript:alert\('bar'\);)如果你决定让“安全”标签通过,我建议你在输出之前找到一些现成的库来解析和清理你的代码。在你的消毒剂相当安全之前,你必须先检测出a lot of XSS vectors。
https://stackoverflow.com/questions/53728
复制相似问题