如何防止用户生成的HTML内的Javascript注入攻击
我正在保存用户提交的HTML(在数据库中)。 我必须防止Javascript注入攻击。 我所看到的最有害的是一个style =“expression(…)”的脚本。
除此之外,相当数量的有效用户内容将包括特殊字符和XML结构,因此如果可能的话,我想避免使用白名单方法。 (列出每个允许的HTML元素和属性)。
Javascript攻击string的例子是:
1)
“你好,我对<dog>元素有一个<script>警告(”坏!“)</ script>问题…”
2)
“嗨,这个<b style =”width:expression式(alert('bad!'))“>狗</ b>是黑色的。
有没有办法来防止这样的Javascript,并保持完整的rest?
我迄今唯一的解决scheme是使用正则expression式来删除某些模式。 它解决了案例1,但不是案例2。
编辑:对不起,忘了提及环境 – 它本质上是MS堆栈:
- SQL Server 2005
- C#3.5(ASP.NET)
- Javascript(显然)和jQuery。
我想chopppoint是ASP.NET层 – 任何人都可以制作一个错误的HTTP请求。
编辑2:
感谢大家的链接。 假设我可以定义我的列表(他的内容将包括许多math和编程结构,所以白名单将是非常恼人的)我仍然有一个问题在这里:
什么样的parsing器可以让我删除“坏”的部分? 坏的部分可能是一个完整的元素,但是那些驻留在属性中的脚本又如何? 我无法删除<a hrefs> willy-nilly。
你以为是吗? 看看这个 。
无论采取什么方法,您都必须使用白名单。 这是唯一的方法,即使接近你的网站允许的安全。
编辑 :
不幸的是,我对.NET不熟悉,但是你可以检查一下stackoverflow与XSS( http://blog.stackoverflow.com/2008/06/safe-html-and-xss/ )的对战,编写parsing发布在这个网站上的HTML: Archive.org链接 – 显然你可能需要改变这个,因为你的白名单更大,但是这应该让你开始。
在我看来,元素和属性的白名单是唯一可以接受的select。 任何不在白名单上的东西都应该被剥离或编码(将<>&“更改为实体)。同时请确保在允许的属性中检查值。
不pipe怎么样,你都在为自己解决问题 – 已知的漏洞或将来会被发现的漏洞。
唯一真正安全的方法是使用白名单。 编码所有内容,然后将允许的代码转换回来。
我已经看到相当先进的尝试,只是不允许危险的代码,它仍然不能很好地工作。 试图安全地捕捉任何人都可以想到的事情是一件非常有意思的事情,而且很容易做一些根本不危险的事情的replace。
Paolo说,基本上,你应该把重点放在用户可以做的事情上,而不是试图去过滤那些他们不应该做的事情。
保留允许的HTML标签(像b,i,u …的东西)的列表,并过滤掉所有其他东西。 您可能还希望将所有属性移除到允许的HTML标记中(例如,因为您的第二个示例)。
另一个解决scheme是引入所谓的BB代码,这是很多论坛使用的。 它具有与HTML相似的语法,但是从允许代码的白名单开始,然后将其转换为HTML。 例如,[b]例子[/ b]会导致例子 。 请确保在使用BB代码时仍然事先过滤掉HTML标签。
目前最好的select是使用内容安全策略头像这样:
Content-Security-Policy: default-src 'self';
这将防止加载内联和外部脚本,样式,图像等,因此只有来自同一个源的资源才会被浏览器加载和执行。
但是,它不适用于旧的浏览器。
你使用什么服务器端代码? 根据哪一个有一些或多个方法可以过滤出恶意脚本,但这是危险的领域。 即使经验丰富的proffesionals被抓出来: http : //www.codinghorror.com/blog/archives/001167.html
你可以使用这个限制function。
function restrict(elem){ var tf = _(elem); var rx = new RegExp; if(elem == "email"){ rx = /[ '"]/gi; }else if(elem == "search" || elem == "comment"){ rx = /[^az 0-9.,?]/gi; }else{ rx = /[^a-z0-9]/gi; } tf.value = tf.value.replace(rx , "" ); }