为什么这个ASP.NET RegularExpressionValidator验证危险的HTML不起作用?

时间:2014-01-31 10:01:41

标签: html asp.net regex validation

在阅读有关导致ASP.NET抱怨危险输入的原因的ASP.NET request validation causes: is there a list?帖后,我决定编写自己的正则表达式,以便在RegularExpressionValidator中使用。

我创建了一个正则表达式,用于测试Travis接受的答案中的第2点和第3点......

  
      
  • 2 - 如果&字符位于&#序列中(例如 表示非破坏空格),则为“危险字符串”。
  •   
  • 3 - 如果<字符属于<x(其中“x”是任何字母字符az),<!</或{{1} },这是一个“危险的字符串。”
  •   

^(。)(&安培;#)+ |(小于[!?A-ZA-Z / \])(。)+ $

使用regexlib.com上的测试仪似乎很有效,因为它匹配了你所期望的所有东西,而不是你想要的东西。

但是当我在ASP.NET RegularExpressionValidator上使用表达式时,验证器会触发任何文本!它在Firefox或IE上也是如此,并且EnableClientScript是真还是假。我正在使用.NET 4.5.1,但我不认为这有任何区别。 任何想法为什么以及如何解决它或为什么它不起作用?

2 个答案:

答案 0 :(得分:2)

我没有研究过ASP.NET RegularExpressionValidator和regexlib.com解析器之间的区别,但是我打赌你的正则表达式有问题。

当我在regexpal.com上试用你的正则表达式时,它与我期望它匹配的任何内容都不匹配(可能我还没有正确理解这些要求)。

修改

以下内容将匹配包含以下字符串的字符串:

  • &#
  • <a-z
  • <!
  • </
  • <?

这是:

^((?!(&#)|(<[a-zA-Z!/\?])).)*$

See it in action at RegexPal.com

有关反正则表达式的详细信息,请参阅this question

我的原始答案(与要求相反)

我想出了这一点,允许点2之前和之后的任何字符或点3之前和之后的任何字符

这是:

^.*(&#)+.*$|^.*(<[a-zA-Z!/\?])+.*$

View on RegexPal

答案 1 :(得分:0)

我认为这就是你要找的东西:

&#[!?a-zA-Z/]+

虽然,我无法理解你的问题,所以我可能需要进行一些修正。