这会删除所有可能的脚本标签吗?

时间:2009-09-18 04:13:17

标签: c# javascript regex

我正在尝试创建一个只需查找和删除脚本标记的正则表达式(它是我想删除的唯一标记,因为我认为它是唯一可能导致损坏的标记)。

无论如何我知道有很多方法可以编写一个仍然有效的脚本标签。这会抓住他们吗?

<\s*script\s*>.*?<\s*\/script\s*>

修改

或者尝试将它们全部更改为安全标签会更好吗?你知道它在标签上的html编码在哪里吗?但它只能在脚本标签上,因为我仍然想要允许其他html标签,如<b>和东西。

5 个答案:

答案 0 :(得分:7)

在几乎所有想要过滤此类事物的情况下,最好检查一下你特别想要允许的内容,而不是你想要禁止的内容。在HTML源代码中隐藏<script>标记有很多创造性的方法,你不想尝试追赶人们可能发明的新标记。另一方面,您可以非常轻松地创建可接受标记的列表,并让人们使用它们。

答案 1 :(得分:3)

它不是唯一可能造成损害的标签。请考虑以下事项:

<a href="javascript:window.close()">

另外,不,它不会。再次考虑以下事项:

<script language="javascript">window.close()</script>

即使你展开它来处理脚本标签上的属性,那么:

<script src="http://somesite.com/malicious.js" />

老实说,根据我个人的估计,最好的方法是要么拥有一个非常明确的标签/属性白名单,要么引入你自己的标记并完全禁止裸HTML。

修改

为您提供更多信息:

白名单只是一个允许的内容列表,其他所有内容都是不允许的,而不是您最初的黑名单概念,其中不允许使用脚本标记,但其他所有内容都是允许的。

答案 2 :(得分:1)

正则表达式将允许像<script foo=bar><script>这样的东西通过(以及可能造成严重破坏的无数类似事物,但也有人们经常忘记这样的事情:

 <foo onload="document.write('<scri'+'pt>...<'+'/script>')"></foo>

这也让生活变得困难: - (

答案 3 :(得分:0)

您可以使用这些Samples演示如何使用MSHTML具有UI-Less解析器,您可以删除脚本标记,以及您可以实现可以在您的应用程序中完全禁用javascript的自定义服务主机,这里是discussion曾帮我一次。

有两种方法,1你可以设置设计模式,不执行javascript,其他方法是你可以禁用选项URLACTION_SCRIPT_JAVA_USE;

答案 4 :(得分:0)

<b style="left:expression(alert('IE just got pwned'));">Oops...</b>

以下是对问题的良好讨论:Sanitising HTML is an extremely hard problem.