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,因此无法执行。
<script/>
浏览器无法执行上述操作。
**除非他们是在浏览器的错误。*