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

我不关心其他types的攻击。 只是想知道HTML编码是否可以防止各种XSS攻击。

即使使用HTML编码,是否有某种方法可以执行XSS攻击?

没有。

抛开允许一些标签的问题(不是问题的重点),HtmlEncode根本不覆盖所有的XSS攻击。

例如,考虑服务器生成的客户端JavaScript – 服务器dynamic输出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(其中恶意脚本是在客户端dynamic生成的,例如基于#值)。

另外不要忘记UTF-7types的攻击 – 攻击看起来像

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

没有太多的编码…

当然,这个解决scheme(除了正确和限制性的白名单inputvalidation之外)是执行上下文相关的编码:如果输出上下文是HTML,或者需要JavaScriptEncoding,VBScriptEncoding或AttributeValueEncoding,则HtmlEncoding非常好或…等

如果您使用的是MS ASP.NET,则可以使用其反XSS库,该库提供了所有必要的上下文编码方法。

请注意,所有的编码都不应该限制在用户input的范围内,而且还应该存储来自数据库,文本文件等的值。

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

一些更多的信息和一个非常确定的列表(不断更新),请查看RSnake的Cheat Sheet: http ://ha.ckers.org/xss.html

如果你在显示之前系统地编码所有的用户input, 那么你是安全的,你仍然不是100%的安全。
(有关更多详细信息,请参阅@ Avid的post)

此外,如果您需要让某些标签进行未编码,以便您允许用户发布图像或粗体文本或需要用户input的任何function被处理为(或转换为)未编码的标记,则会出现问题。

你将不得不build立一个决策制定系统来决定哪些标签是允许的,哪些是不允许的,而且总是有可能find让非允许的标签通过的方法。

如果您按照Joel关于使错误代码看起来错误的build议,或者在您输出未经处理的用户数据(静态input)时警告/不编译您的语言来帮助您 ,这会有所帮助 。

如果你编码的一切将会。 (取决于你的平台和htmlencode的实现)但是,任何有用的Web应用程序是如此复杂,很容易忘记检查它的每一个部分。 或者,也许第三方组件是不安全的。 或者,也许一些代码path,你虽然编码没有这样做,所以你忘了它在别的地方。

所以你可能也想检查input端的东西。 你可能想要检查你从数据库中读取的东西。

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

正如Pat提到的,你有时候会想显示一些标签,而不是所有的标签。 一个常见的方法是使用标记语言,如Textile , Markdown或BBCode 。 但是,即使标记语言也容易受到XSS的影响,请注意。

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

如果你决定让“安全”标签通过,我会build议find一些现有的库来parsing和消毒你的代码在输出之前。 那里有很多的XSS载体 ,你必须在你的消毒剂是相当安全的之前检测。

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

一个经典的简单的错误自制输出filter使得只捕获<和>,但错过像“,它可以打破用户控制输出到HTML标签的属性空间,其中JavaScript可以附加到DOM。

不,只是编码普通的HTML令牌不会完全保护您的网站免受XSS攻击。 例如,请参阅google.com中的这个XSS漏洞:

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

这种漏洞的重要之处在于攻击者能够使用UTF-7编码他的XSS负载,如果你的页面上没有指定不同的字符编码,用户的浏览器可以解释UTF-7负载,执行攻击脚本。

你需要检查的另一件事是你的input来自哪里。 您可以使用引用string(大部分时间)来检查它是来自您自己的页面,但在表单中放入一个隐藏的随机数字或其他内容,然后检查它(也可以使用会话设置variables),这也有助于了解input来自您自己的网站,而不是一些钓鱼网站。

我想build议HTML净化器( http://htmlpurifier.org/ )它不只是过滤的HTML,它基本上标记和重新编译它。 这是真正的工业实力。

它有额外的好处,让您确保有效的HTML / XHTML输出。

此外,纺织品,它是一个伟大的工具,我一直使用它,但我也运行它,但也净化器。

我不认为你明白我的意思是什么。 HTML净化器不只是“过滤”,它实际上重build的HTML。 http://htmlpurifier.org/comparison.html

我不这么认为。 Html Encode将所有function字符(浏览器可能解释为代码的字符)转换为实体引用,这些引用无法被浏览器parsing,因此无法执行。

 &lt;script/&gt; 

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

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