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

Niy*_*yaz 62 security xss html-encode

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

即使使用HTML Encode,是否有某种方法可以进行XSS攻击?

Avi*_*viD 89

没有.

暂且不谈允许某些标签(不是问题的重点)的主题,HtmlEncode根本不涵盖所有XSS攻击.

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

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

<input value=<%= HtmlEncode(somevar) %> id=textbox>
Run Code Online (Sandbox Code Playgroud)

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

a onclick=alert(document.cookie)
Run Code Online (Sandbox Code Playgroud)

结果输出是

<input value=a onclick=alert(document.cookie) id=textbox>
Run Code Online (Sandbox Code Playgroud)

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

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

另外不要忘记UTF-7类型的攻击 - 攻击的样子

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-
Run Code Online (Sandbox Code Playgroud)

没有什么可以编码那里...

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

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

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

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

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

  • Espo - 我在这个游戏的后期 - 但它肯定有助于封闭和编码 - 如在你的例子中htmlencoding它(引用)将产生:" 因此将是onclick =&quot; alert() (4认同)
  • @Adam,这里适当的解决方案是*attribute-encode*it(除了包含它),而不是html-encode.上下文不同,所以编码规则也不同 - html编码对你没有帮助. (3认同)
  • @AviD给定一个HtmlEncode()函数**对引号字符进行*编码(如示例中的ASP代码所示),你能为`<input value ="<%= HtmlEncode(value)%提供一个XSS值的例子吗? >"id = textbox>`? (2认同)

Pat*_*Pat 9

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

此外,当您需要让某些标签无编码以便您允许用户发布图像或粗体文本或任何需要将用户输入的功能作为(或转换为)未编码标记处理时,会出现问题.

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

如果您遵循Joel的建议,使错误的代码看起来错误,或者当您输出未处理的用户数据(静态类型)时,您的语言通过警告/不编译来帮助您,这会有所帮助.