8

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

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

4

6 回答 6

11

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

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


白名单(好方法)

请参阅有关HTML sanitisation的这篇文章,其中提供了一些具体示例,说明为什么应该将其列入白名单而不是列入黑名单。从该页面引用:

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

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

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

黑名单(通常是不好的方法)

尽管许多网站过去(和现在)都使用黑名单方法,但几乎从来没有真正需要它。(安全风险总是超过白名单与授予用户的格式化功能所带来的潜在限制。)您需要非常了解它的缺陷。

例如,此页面提供了一个列表,其中列出了您可能想要删除的所谓“所有”HTML 标记。简单地观察一下,您应该注意到它包含的元素名称数量非常有限;浏览器很容易包含一个专有标签,该标签会无意中允许脚本在您的页面上运行,这本质上是黑名单的主要问题。


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

希望这可以让您大致了解为了完全(或至少最大限度地)防止 XSS 需要设计什么,以及在考虑未知因素的情况下执行 HTML 清理的重要性。

于 2009-05-13T16:04:19.557 回答
4

正如 Lee Theobald 所指出的,这是一个非常危险的计划。根据定义,您不能通过过滤/黑名单生成“安全”HTML,因为用户可能会将您没有想到的内容放入 HTML 中(或者甚至在您的浏览器版本中不存在,但在其他版本中存在)。

唯一安全的方法是白名单方法,即去除除纯文本和某些特定 HTML 结构之外的所有内容。顺便说一句,这就是 stackoverflow.com 所做的:-)。

于 2009-05-13T16:06:31.923 回答
3

这是我使用白名单方法(Javascript 和 Python 代码)的方法

https://github.com/dcollien/FilterHTML

我为允许的 HTML 的子集定义了一个规范,这只是应该通过这个过滤器的内容。还有一些选项可以净化 URL 属性,只允许某些方案(如 http:、ftp: 等)并禁止那些会导致 XSS/Javascript 问题的方案(如 javascript:,甚至是数据:)

编辑:这不会在所有情况下为您提供开箱即用的 100% 安全性,但可以智能地使用并与其他一些技巧结合使用(例如检查 url 是否在同一个域上,以及正确的内容类型,等)这可能是你需要的

于 2012-11-03T07:43:25.253 回答
2

如果您希望更改 html,以便用户可以看到 HTML 代码本身。对所有 '<'、'>'、'&' 和 ';' 进行字符串替换。例如,'<' 变为 '<'。

如果您希望 html 正常工作,最简单的方法是删除所有 HTML 和 Javascript,然后仅替换 HTML。不幸的是,几乎无法确定删除所有 javascript 并只允许 HTML 的方法。

例如,您可能希望允许图像。但是你可能不知道你可以做到

<img src='evilscript.js'>

它可以运行该脚本。它变得非常不安全非常快$。这就是为什么像维基百科和本网站这样的大多数网站都使用特殊的降价语言的原因。这使得允许格式化但不允许恶意 javascript 变得更加容易。

于 2009-05-13T16:04:13.207 回答
-1

您可能想检查一些基于浏览器的所见即所得编辑器(如TinyMCE )是如何工作的。他们通常会删除 JS,并且似乎在这方面做得不错。

于 2009-05-13T16:02:51.260 回答
-2

最简单的做法是使用正则表达式去除标签。麻烦的是你可以在没有脚本标签的情况下做很多讨厌的事情(例如嵌入不可靠的图像,链接到其他带有讨厌 Javascript 的网站)。通过将小于/大于字符转换为它们的 HTML 实体形式(例如 <)来完全禁用 HTML 也是一种选择。

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

于 2009-05-13T15:58:23.467 回答