2009-10-05 104 views
1

我想在我的querystrings值中检测JavaScript。正则表达式来检测Javascript在一个字符串

我有下面的C#代码

private bool checkForXSS(string value) 
    { 
     Regex regex = new Regex(@"/((\%3C)|<)[^\n]+((\%3E)|>)/I"); 

     if (regex.Match(value).Success) return true; 

     return false; 
    } 

这适用于检测<script></script>标签,但不幸的是,如果没有标签匹配没有达到。

正则表达式可以匹配JavaScript关键字和分号等吗?

这并不意味着涵盖所有XSS攻击基地。只是一种方法来检测可以在字符串值中的简单的JS攻击。

感谢

+1

好吧,然后你必须检测子字符串“onmouseover”等的存在...阅读我的帖子http:// stackoverflow。com/questions/1520973 /正则表达式-javascript-in-a-string/1521042#1521042 – Rodrigo 2009-10-05 16:39:27

回答

9

第1条规则:使用白名单,而不是黑名单。

您正在阻止一种方法来执行XSS,而不是任何方法。要做到这一点,你必须验证对你应该接受什么样的用户输入的输入,即

  • 如果你希望一个号码,验证对/^\d{1, n}$/
  • 输入如果你希望一个字符串,验证它反对/^[\s\w\.\,]+$/等等...

如需进一步信息,开始读Wikipedia entryentry at OWASPwebappsec articles和一些随机blog entries written by unknown people

+0

伤心无人赶上“陌生人”的笑话 – Rodrigo 2009-10-09 15:26:58

3

这是防止跨站点脚本攻击的一个非常蹩脚的方式。您需要使用完全不同的方法:请确保您的用户提供的输入是:

  1. 验证,例如它匹配所收集的数据的语义;

  2. 每次用它来构造表达式时,都会被某些语言解释器(SQL,HTML,Javascript - 甚至是转到纯文本日志文件时)解释的适当引用。适当的引用完全取决于输出上下文,并且没有单一的方法来执行它。

+0

我正在拾取querystrings放到页面的现有应用程序。我需要检查javascript的值,例如警报,功能,事件等和HTML。我上面的正则表达式检查标签,但不检查JS关键字等。我想在将JS放入页面之前去除它。 – w4ymo 2009-10-05 21:49:33

+0

对不起,但我真的不明白这意味着什么。 – Pointy 2009-10-08 16:59:54

-5

您应该检查标签<script是否存在。

private bool checkForXSS(string value) 
{ 
    return value.IndexOf("<script") != -1; 
} 
+5

假。 'onclick','onmouseover'等可以存在而不需要脚本标记。 – ceejayoz 2009-10-05 17:51:05

+0

我可以想到其他一些规避这种情况的方法;这是一个糟糕的做法。 – 2009-10-06 13:35:11

+0

好的,我没有想到... – pauloya 2009-10-07 11:26:53

1

嵌入javascript的方法很多。例如。

%3Cp+style="expression(alert('hi'))" 

将通过您的过滤器。

你可能找不到一个能够找到所有JS并且不会拒绝大量有效查询字符串的神奇正则表达式。

这种检查可能是有用的,但它应该只是防御深度的一部分。

相关问题