我不关心其他类型的攻击。只想知道 HTML Encode 是否可以防止各种 XSS 攻击。
即使使用 HTML 编码,是否有某种方法可以进行 XSS 攻击?
我不关心其他类型的攻击。只想知道 HTML Encode 是否可以防止各种 XSS 攻击。
即使使用 HTML 编码,是否有某种方法可以进行 XSS 攻击?
不。
撇开允许一些标签的主题(不是问题的重点),HtmlEncode 根本不涵盖所有 XSS 攻击。
例如,考虑服务器生成的客户端 javascript - 服务器将 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(其中恶意脚本是在客户端动态生成的,例如基于 # 值)。
也不要忘记 UTF-7 类型的攻击——攻击看起来像
+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-
没有什么可以编码的......
当然,解决方案(除了适当和限制性的白名单输入验证之外)是执行上下文相关编码:如果您输出的上下文是 HTML,或者您可能需要 JavaScriptEncoding、VBScriptEncoding 或 AttributeValueEncoding,则 HtmlEncoding 非常有用,或者……等等。
如果您使用的是 MS ASP.NET,则可以使用他们的 Anti-XSS 库,它提供了所有必要的上下文编码方法。
请注意,所有编码不应仅限于用户输入,还应包括来自数据库、文本文件等的存储值。
哦,不要忘记在 HTTP 标头和 META 标记中显式设置字符集,否则您仍然会有 UTF-7 漏洞......
更多信息和非常明确的列表(不断更新),请查看 RSnake 的备忘单:http ://ha.ckers.org/xss.html
如果您在显示之前系统地编码所有用户输入,那么是的,您是安全的,您仍然不是 100% 安全。
(更多详情请参阅@Avid 的帖子)
此外,当您需要让某些标签未编码时会出现问题,以便您允许用户发布图像或粗体文本或任何需要将用户输入处理为(或转换为)未编码标记的功能。
您必须建立一个决策系统来决定哪些标签是允许的,哪些是不允许的,并且总是有可能有人会想办法让一个不允许的标签通过。
如果您遵循 Joel 关于使错误代码看起来错误的建议,或者您的语言在输出未处理的用户数据(静态类型)时通过警告/不编译来帮助您,这将有所帮助。
如果您对所有内容都进行编码。(取决于您的平台和 htmlencode 的实现)但是任何有用的 Web 应用程序都非常复杂,很容易忘记检查它的每个部分。或者,第 3 方组件可能不安全。或者,也许您进行编码的某些代码路径没有这样做,所以您在其他地方忘记了它。
所以你可能也想检查输入端的东西。您可能想检查从数据库中读取的内容。
正如其他人所提到的,只要在显示之前对所有用户输入进行编码,您就安全了。这包括从数据库中检索到的所有请求参数和数据,这些参数可以通过用户输入进行更改。
正如Pat 所提到的,您有时会想要显示一些标签,而不是所有标签。一种常见的方法是使用诸如Textile、Markdown或BBCode之类的标记语言。但是,即使是标记语言也可能容易受到 XSS 的攻击,请注意。
# Markup example
[foo](javascript:alert\('bar'\);)
如果您确实决定让“安全”标签通过,我建议您在输出之前找到一些现有的库来解析和清理您的代码。在您的消毒剂相当安全之前,您必须检测到很多 XSS 向量。
我第二个 metavida 的建议是找到一个第三方库来处理输出过滤。中和 HTML 字符是阻止 XSS 攻击的好方法。但是,用于转换元字符的代码可能容易受到规避攻击;例如,如果它不能正确处理 Unicode 和国际化。
自制输出过滤器犯的一个典型的简单错误是仅捕获 < 和 >,但错过了诸如“”之类的内容,这可能会将用户控制的输出分解到 HTML 标记的属性空间中,其中 Javascript 可以附加到 DOM。
不,仅编码常见的 HTML 令牌并不能完全保护您的网站免受 XSS 攻击。例如,请参阅在 google.com 中发现的这个 XSS 漏洞:
http://www.securiteam.com/securitynews/6Z00L0AEUE.html
此类漏洞的重要之处在于,攻击者能够使用 UTF-7 对其 XSS 有效负载进行编码,如果您没有在页面上指定不同的字符编码,用户的浏览器可以解释 UTF-7 有效负载并且执行攻击脚本。
我想建议 HTML Purifier ( http://htmlpurifier.org/ ) 它不只是过滤 html,它基本上是标记化并重新编译它。它是真正的工业实力。
它还有一个额外的好处是允许您确保有效的 html/xhtml 输出。
还有 n'thing Textile,它是一个很棒的工具,我一直在使用它,但我也会通过 html purifier 运行它。
我认为你不明白我的意思是重新标记。HTML Purifier 不只是“过滤”,它实际上重构了 html。http://htmlpurifier.org/comparison.html
您需要检查的另一件事是您的输入来自哪里。您可以使用引荐来源字符串(大部分时间)来检查它是否来自您自己的页面,但是在您的表单中输入一个隐藏的随机数或其他内容,然后检查它(可能使用会话集变量)也有助于了解输入来自您自己的网站,而不是某些网络钓鱼网站。
我不相信。Html Encode 将所有功能字符(可以被浏览器解释为代码的字符)转换为浏览器无法解析并因此无法执行的实体引用。
<script/>
浏览器无法执行上述操作。
**除非它们是浏览器中的错误。*
myString.replace(/<[^>]*>?/gm, '');
我用它,然后成功。 从文本 JavaScript 中剥离 HTML