如何在用户生成的HTML中防止Javascript注入攻击
我正在保存用户提交的HTML(在数据库中)。我必须防止JavaScript注入攻击。我见过的最有害的是如何在用户生成的HTML中防止Javascript注入攻击,javascript,html,regex,parsing,code-injection,Javascript,Html,Regex,Parsing,Code Injection,我正在保存用户提交的HTML(在数据库中)。我必须防止JavaScript注入攻击。我见过的最有害的是style=“expression(…)”中的JavaScript 除此之外,相当数量的有效用户内容将包括特殊字符和XML结构,因此如果可能,我希望避免使用白名单方法。(列出每个允许的HTML元素和属性) JavaScript攻击字符串的示例: 一, 有没有一种方法可以阻止这种JavaScript,而让其余的保持不变 到目前为止,我唯一的解决方案是使用正则表达式删除某些模式。它解决了案例1,但
style=“expression(…)”
中的JavaScript
除此之外,相当数量的有效用户内容将包括特殊字符和XML结构,因此如果可能,我希望避免使用白名单方法。(列出每个允许的HTML元素和属性)
JavaScript攻击字符串的示例:
一,
有没有一种方法可以阻止这种JavaScript,而让其余的保持不变
到目前为止,我唯一的解决方案是使用正则表达式删除某些模式。它解决了案例1,但没有解决案例2
该环境本质上是Microsoft堆栈:
- SQL Server 2005
- C#3.5(ASP.NET)
- JavaScript和jQuery
。你认为就这样吗
不管你采取什么方法,你肯定需要使用一个白名单。这是唯一一种接近安全的方法,你可以在你的网站上允许什么
编辑:
不幸的是,我不熟悉.NET,但您可以查看stackoverflow自己与XSS()的斗争,以及为解析此网站上发布的HTML而编写的代码:-显然,您可能需要更改这一点,因为您的白名单更大,但这应该让你开始了。元素和属性的白名单是我认为唯一可以接受的选择。任何不在白名单上的内容都应该删除或编码(将&“更改为实体)。此外,请确保检查您允许的属性中的值
如果你不这样做,你就会暴露出问题——已知的漏洞或将来会发现的漏洞。你使用的服务器端代码是什么?这取决于有多少种方法可以过滤出恶意脚本,但这是一个危险的领域。即使是经验丰富的专业人员也会被发现:基本上,正如Paolo说,你应该关注用户可以做什么,而不是试图过滤掉他们不应该做的事情 保留一个允许的HTML标记列表(如b、i、u…)并过滤掉所有其他内容。您可能还希望删除允许的HTML标记的所有属性(例如,因为您的第二个示例)
另一个解决方案是引入所谓的BB代码,这是许多论坛使用的。它的语法与HTML相似,但首先是允许代码的白名单,然后将其转换为HTML。例如,[b]example[/b]将导致示例。请确保在使用BB代码之前仍然过滤掉HTML标记。唯一真正安全的方法是使用白名单。对所有内容进行编码,然后将允许的代码转换回来
我看到过一些相当高级的尝试,只禁止危险代码,但它仍然不能很好地工作。尝试安全地捕获任何人都能想到的东西是相当了不起的,而且它很容易对一些根本不危险的东西进行恼人的替换。您可以使用此限制功能
功能限制(elem){
var tf=Um(elem);
var rx=新的RegExp;
如果(元素==“电子邮件”){
rx=/['”]/gi;
}else if(元素==“搜索”| |元素==“注释”){
rx=/[^a-z 0-9.,?]/gi;
}否则{
rx=/[^a-z0-9]/gi;
}
tf.value=tf.value.replace(rx,“”);
}
目前最好的选择是使用如下标题:
Content-Security-Policy: default-src 'self';
这将阻止加载内联和外部脚本、样式、图像等,因此浏览器将仅加载和执行来自同一来源的资源
但是,它在旧浏览器上不起作用。谢谢,我实际上将该网站用作测试平台。我已经成功地删除了任何看起来像
。耶,XSS!黑名单不起作用。不管你的白名单长不长,都没有办法将其列入黑名单。如果你想阅读更多关于这方面的文章,OWASP网站会有很大帮助。请在这里解释一下白名单是什么,以及它是如何操作/删除不好的东西的?我担心内容将包括许多数学和编程结构(XML、C#等),所以我很想避免白名单。我找到了困难的方法。我们现在正在使用转义和白名单。没有任何解释的转储代码只会导致混乱,特别是如果它甚至不起作用:这意味着什么-->\uuUm(elem)
?这会阻止我们使用CDN吗?@DanielWu是的,但您可以将CDN域或文件哈希白名单
"Hi, this <b
style="width:expression(alert('bad!'))">dog</b>
is black."
Content-Security-Policy: default-src 'self';