关于安全性:HTML编码会阻止各种XSS攻击吗?

关于安全性:HTML编码会阻止各种XSS攻击吗?

Will HTML Encoding prevent all kinds of XSS attacks?

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

即使使用HTML编码,也可以通过某种方式进行XSS攻击吗?


没有。

撇开允许使用某些标签的主题(实际上并不是问题的重点),HtmlEncode根本无法涵盖所有??XSS攻击。

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

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

1
<input value=<%= HtmlEncode(somevar) %> id=textbox>

现在,如果它不是立即显而易见的话,例如将somevar(当然是由用户发送)设置为

1
a onclick=alert(document.cookie)

结果输出是

1
<input value=a onclick=alert(document.cookie) id=textbox>

这显然会工作。显然,这几乎可以是任何其他脚本...而且HtmlEncode并没有太大帮助。

还需要考虑一些其他媒介...包括XSS的第三种形式,称为基于DOM的XSS(其中恶意脚本是在客户端上动态生成的,例如基于#值)。

同样不要忘记UTF-7类型的攻击-攻击看起来像

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

没什么可编码的...

当然,解决方案(除了适当且有限制的白名单输入验证之外)是执行上下文相关的编码:如果您要输出的上下文是HTML,则HtmlEncoding很棒,或者您可能需要JavaScriptEncoding或VBScriptEncoding或AttributeValueEncoding或...等。

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

请注意,所有编码均不应仅限于用户输入,还应限制来自数据库,文本文件等的存储值。

哦,别忘了在HTTP标头和META标签中显式设置字符集,否则您仍然会遇到UTF-7漏洞...

有关更多信息以及完整的清单(不断更新),请查看RSnake的备忘单:http://ha.ckers.org/xss.html


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

另外,当您需要让一些标签不进行编码时,还会出现问题,以便允许用户发布图像或粗体文本,或者要求将用户输入作为(或转换为)未编码标记处理的任何功能。

您将必须建立一个决策系统来决定允许哪些标签和哪些不允许,并且总有可能有人会找出一种方法来允许不允许的标签通过。

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


如果对所有内容进行编码,它将进行编码。 (取决于您的平台和htmlencode的实现),但是任何有用的Web应用程序都非常复杂,以至于很容易忘记检查它的每个部分。或者,第三方组件并不安全。或者,也许您虽然进行了编码的某些代码路径却没有这样做,所以您在其他地方忘记了它。

因此,您可能也想在输入端检查一下。您可能想检查从数据库读取的内容。


不,仅编码常见的HTML令牌并不能完全保护您的网站免受XSS攻击。例如,请参阅google.com中发现的此XSS漏洞:

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

此类漏洞的重要之处在于,攻击者能够使用UTF-7对XSS有效载荷进行编码,并且如果您在页面上未指定其他字符编码,则用户的浏览器可以解释UTF-7有效载荷,并且执行攻击脚本。


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

自制程序输出过滤器的一个典型的简单错误是仅捕获<和>,但是错过了诸如"之类的东西,它可能会将用户控制的输出分解为HTML标记的属性空间,而Javascript可以附加到DOM。


正如其他所有人所提到的,只要在对所有用户输入进行编码之前对其进行编码,就可以保证安全。这包括可以从用户输入更改的所有请求参数和从数据库检索到的数据。

正如Pat所提到的,您有时会希望显示一些标签,而并非所有标签。一种常见的实现方法是使用标记语言,例如Textile,Markdown或BBCode。但是,请注意,即使标记语言也可能容易受到XSS的攻击。

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

如果您决定让"安全"标签通过,建议您在输出之前找到一些现有的库来解析和清理代码。在您的消毒剂相当安全之前,您必须检测很多XSS向量。


您需要检查的另一件事是您的输入来自何处。您可以使用引荐来源网址字符串(大多数情况下)来检查它是否来自您自己的页面,但是在表格中放入隐藏的随机数或某些内容,然后再对其进行检查(可能带有会话集变量),这也有助于了解输入来自您自己的网站,而不是某些网络钓鱼网站。


我想建议HTML Purifier(http://htmlpurifier.org/)它不仅过滤html,而且基本上将其标记化并重新编译。这是真正的工业实力。

它具有允许您确保有效的html / xhtml输出的其他好处。

还有纺织,它是一个很棒的工具,我一直都在使用它,但是我也会通过html purifier运行它。

我认为您不了解我所说的重新令牌。 HTML Purifier不仅仅是"过滤器",它实际上是在重建HTML。 http://htmlpurifier.org/comparison.html


我不相信Html Encode将所有功能字符(可被浏览器解释为代码的字符)转换为实体引用,该实体引用无法被浏览器解析,因此无法执行。

1
<script/>

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

**除非它们是课程浏览器中的错误。*


推荐阅读

    查看linux类型命令?

    查看linux类型命令?,系统,信息,命令,状态,数据,数字,情况,地址,类型,文件,lin

    linux删除类型命令?

    linux删除类型命令?,系统,档案,命令,文件,名称,环境,数据,不了,目录,文件夹,

    linux命令看文件编码?

    linux命令看文件编码?,状态,系统,文件,工具,名称,数据,命令,格式,汉字,以下,L

    查看linux库类型命令?

    查看linux库类型命令?,系统,工作,信息,状态,电脑,命令,工具,代码,地址,发行,

    linux网卡类型命令?

    linux网卡类型命令?,网络,系统,地址,信息,设备,状态,服务,名称,名字,网卡,如

    linux命令改变编码?

    linux命令改变编码?,系统,文件,工作,代码,工具,命令,字符集,格式,以下,方式,l

    linux查看命令类型用?

    linux查看命令类型用?,信息,系统,情况,命令,实时,工作,设备,电脑,文件,类型,

    修改linux编码命令?

    修改linux编码命令?,系统,文件,命令,情况,标准,工作,格式,字符集,以下,方式,l

    linux命令三种类型?

    linux命令三种类型?,工作,地址,系统,标准,时间,管理,命令,目录,信息,文件,lin

    linux攻击ip命令?

    linux攻击ip命令?,地址,工作,系统,电脑,命令,信息,工具,服务,网络,第三,linux

    linux改文件编码命令?

    linux改文件编码命令?,系统,数据,地方,命令,文件,名称,工作,工具,格式,字符

    linux编码命令大全?

    linux编码命令大全?,系统,工作,信息,地址,命令,基础,目录,基础知识,时间,常

    Python 中文编码

    Python 中文编码,代码,培训,中文,你好,文件,世界,格式,实例,以上,结果,前面

    PEP8 Python 编码规范

    PEP8 Python 编码规范,异常,代码,名字,标准,培训,空格,注释,方式,模块,函数

    python的数据类型

    python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.