如何防止用户生成的HTML中的Javascript注入攻击

Jef*_*ang 52 html javascript regex parsing code-injection

我正在保存用户提交的HTML(在数据库中).我必须防止Javascript注入攻击.我见过的最有害的是style ="expression(...)"中的脚本.

除此之外,有效用户内容的公平金额将包含特殊字符和XML结构,所以我想如果可能的话,避免白名单的做法.(列出每个允许的HTML元素和属性).

Javascript攻击字符串的示例是:

1)

"你好,<dog>元素有一个<script> alert("bad!")</ script>问题......"

2)

"嗨,这个<b style ="width:表达式(警告('坏!'))">狗</ b>是黑色的."

有没有办法防止这样的Javascript,并保持其余的完整?

到目前为止,我唯一的解决方案是使用正则表达式来删除某些模式.它解决了案例1,但不是案例2.

编辑: 对不起,忘了提及环境 - 它本质上是MS堆栈:

  • SQL Server 2005
  • C#3.5(ASP.NET)
  • Javascript(显然)和jQuery.

我希望阻塞点成为ASP.NET层 - 任何人都可以制作错误的HTTP请求.

编辑2:

感谢大家的链接.假设我可以定义我的列表(他的内容将包含许多数学和编程结构,因此白名单会非常烦人)我仍然有一个问题:

什么样的解析器允许我删除"坏"部分?坏部分可能是一个完整的元素,但那么属于这些属性的脚本呢.我无法删除<a hrefs> willy-nilly.

Pao*_*ino 36

你认为那是吗?看看这个.

无论采取何种方法,您都需要使用白名单.这是唯一可以接近您在网站上允许的内容的方法.

编辑:

不幸的是,我不熟悉.NET,但你可以查看stackoverflow自己与XSS(http://blog.stackoverflow.com/2008/06/safe-html-and-xss/)的战斗以及代码编写本网站上发布的HTML解析:Archive.org链接 - 显然你可能需要更改这个,因为你的白名单更大,但这应该让你开始.

  • 杰夫,试试这个字符串:`<scr <script> ipt>`.是的XSS!黑名单不起作用.无论您的白名单是否很长,都无法将此列入黑名单.如果您想阅读更多关于此的文章,OWASP网站可以提供很多帮助. (5认同)
  • 如果您的方法是删除危险的东西,您的代码将很容易注入.唯一安全的方法是拥有一个特别允许的元素和属性的白名单. (2认同)

Bar*_*itz 7

在我看来,元素和属性的白名单是唯一可以接受的选择.应该删除或编码不在白名单上的任何内容(将<>&"更改为实体).另外,请务必检查您允许的属性中的值.

更少的东西,你正在打开自己的问题 - 已知的漏洞或将来会发现的漏洞.


Ada*_*dam 5

目前最好的选择是使用内容安全策略标头,如下所示:

Content-Security-Policy: default-src 'self';
Run Code Online (Sandbox Code Playgroud)

这将阻止加载内联和外部脚本、样式、图像等,因此浏览器只会加载和执行来自同一来源的资源。

但是,它不适用于旧浏览器。