我正在保存用户提交的 HTML(在数据库中)。我必须防止 JavaScript 注入攻击。我见过的最有害的是style="expression(...)"
.
除此之外,相当数量的有效用户内容将包括特殊字符和 XML 结构,因此我希望尽可能避免使用白名单方法。(列出每个允许的 HTML 元素和属性)。
JavaScript 攻击字符串示例:
1.
"Hello, I have a
<script>alert("bad!")</script>
problem with the <dog>
element..."
"Hi, this <b
style="width:expression(alert('bad!'))">dog</b>
is black."
有没有办法阻止这样的 JavaScript,并保持其余部分完好无损?
到目前为止,我唯一的解决方案是使用正则表达式来删除某些模式。它解决了案例 1,但没有解决案例 2。
该环境本质上是 Microsoft 堆栈:
- SQL 服务器 2005
- C# 3.5 (ASP.NET)
- JavaScript 和 jQuery。
我希望阻塞点是 ASP.NET 层——任何人都可以制作一个糟糕的 HTTP 请求。
编辑
谢谢大家的链接。假设我可以定义我的列表(内容将包括许多数学和编程结构,所以白名单会很烦人),我还有一个问题:
什么样的解析器可以让我只删除“坏”部分?坏的部分可能是整个元素,但是那些驻留在属性中的脚本呢?我不能随意删除< a hrefs >
。