我并不担心其他类型的攻击.只想知道HTML Encode是否可以防止各种XSS攻击.
即使使用HTML Encode,是否有某种方法可以进行XSS攻击?
没有.
暂且不谈允许某些标签(不是问题的重点)的主题,HtmlEncode根本不涵盖所有XSS攻击.
例如,考虑服务器生成的客户端javascript - 服务器将htmlencoded值直接动态输出到客户端javascript中,htmlencode 不会停止执行注入脚本.
接下来,考虑以下伪代码:
id=textbox>
现在,如果不是很明显,如果somevar(当然是由用户发送)设置为例如
a onclick=alert(document.cookie)
结果输出是
这显然有用.显然,这可能(几乎)任何其他脚本......而HtmlEncode也无济于事.
还有一些额外的载体需要考虑......包括第三种XSS,称为基于DOM的XSS(其中恶意脚本是在客户端上动态生成的,例如基于#值).
另外不要忘记UTF-7类型的攻击 - 攻击的样子
+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-
没有什么可以编码那里...
当然,除了正确和限制性的白名单输入验证之外,解决方案是执行上下文相关编码:如果您输出上下文是IS HTML,或者您需要JavaScriptEncoding,或VBScriptEncoding或AttributeValueEncoding ,则HtmlEncoding很棒,或......等
如果您使用的是MS ASP.NET,则可以使用其Anti-XSS Library,它提供了所有必需的上下文编码方法.
请注意,所有编码不应仅限于用户输入,还应包括数据库,文本文件等中的存储值.
哦,不要忘记在HTTP标头和META标签中明确设置字符集,否则你仍然会有UTF-7漏洞......
更多信息,以及一个非常明确的清单(不断更新),请查看RSnake的备忘单:http://ha.ckers.org/xss.html
如果您在显示之前系统地对所有用户输入进行编码然后是,那么您是安全的,您仍然不是100%安全.
(有关详细信息,请参阅@ Avid的帖子)
此外,当您需要让某些标签无编码以便您允许用户发布图像或粗体文本或任何需要将用户输入的功能作为(或转换为)未编码标记处理时,会出现问题.
您将必须建立一个决策系统来决定允许哪些标签,哪些标签不允许,并且总有可能找到让非允许标签通过的方法.
如果您遵循Joel的建议,使错误的代码看起来错误,或者当您输出未处理的用户数据(静态类型)时,您的语言通过警告/不编译来帮助您,这会有所帮助.