从HTML中过滤JavaScript

6 html javascript xss filtering sanitization

我有一个富文本编辑器,可以将HTML传递给服务器.然后,该HTML将显示给其他用户.我想确保HTML中没有JavaScript.有没有办法做到这一点?

另外,如果有帮助,我正在使用ASP.NET.

Nol*_*rin 10

确保某些HTML标记不包含任何JavaScript 的唯一方法是过滤掉所有不安全的HTML标记和属性,以防止跨站点脚本(XSS).

但是,通常没有可靠的方法通过名称明确删除所有不安全的元素和属性,因为某些浏览器可能会解释在设计时您甚至不知道的那些,从而为恶意打开安全漏洞用户.这就是为什么你采用白名单方法而不是黑名单方法要好得多.也就是说,只允许您确定安全的HTML标记,并默认剥离所有其他标记.实际上,只有一个意外允许的标签可以使您的网站容易受到XSS的攻击.


白名单(好方法)

请参阅有关HTML清理的文章,该文章提供了一些具体示例,说明您应该将白名单列入黑名单而不是列入黑名单.从该页面引用:

以下是潜在危险的HTML标记和属性的不完整列表:

  • script,其中可能包含恶意脚本
  • applet,, embedobject,可以自动下载和执行恶意代码
  • meta,可能包含恶意重定向
  • onload,onunload和所有其他on*属性,可以包含恶意脚本
  • style,linkstyle属性,可以包含恶意脚本

是另一个有用的页面,它建议了一组HTML标记和属性以及通常可以安全使用的CSS属性,以及推荐的做法.

黑名单(通常不好的做法)

虽然许多网站过去(现在)都使用黑名单方法,但几乎从来没有真正需要它.(安全风险总是超过白名单对授予用户的格式化功能强制执行的潜在限制.)您需要非常了解其缺陷.

例如,此页面列出了您可能想要删除的所有HTML标签.只是简单地观察它,你应该注意到它包含非常有限数量的元素名称; 浏览器可以轻松地包含一个专有标记,无意中允许脚本在您的页面上运行,这实际上是黑名单的主要问题.


最后,我强烈建议您使用.NET DOMHTML DOM库(例如众所周知的HTML Agility Pack),而不是RegEx来执行清理/白名单,因为它会更加可靠.(很有可能创建一些非常疯狂的混淆HTML,可以欺骗正则表达式!无论如何,正确的HTML读取器/写入器使系统编码变得更加容易.)

希望这应该给你一个体面的概述,你需要设计什么才能完全(或至少最大限度地)防止XSS,以及如何在考虑未知因素的情况下执行HTML清洁工作至关重要.

  • 黑名单永远不会起作用,因为其他浏览器可能会解释您甚至不知道的标签.您需要一种白名单方法. (2认同)

Lee*_*ald -2

最简单的方法是使用正则表达式删除标签。问题是,如果没有脚本标签,您可能会做很多令人讨厌的事情(例如嵌入不可靠的图像,链接到其他具有令人讨厌的 Javascript 的网站)。通过将小于/大于字符转换为其 HTML 实体形式(例如 <)来完全禁用 HTML 也可能是一种选择。

如果您想要更强大的解决方案,过去我曾使用AntiSamy来清理传入的文本,以便可以安全地查看。

  • 实际上,“用正则表达式去掉标签”并不是最好的建议。 (4认同)