【问题标题】:Why does this ASP.NET RegularExpressionValidator to validate dangerous html not work?为什么这个用于验证危险 html 的 ASP.NET RegularExpressionValidator 不起作用?
【发布时间】:2014-01-31 10:01:41
【问题描述】:

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

我根据 Travis 接受的答案为测试点 2 和 3 创建了一个正则表达式...

  • 2 - 如果& 字符在&# 序列中(例如,  表示不间断空格),则它是一个“危险字符串”。
  • 3 - 如果< 字符是<x(其中“x”是任何字母字符az)、<!</<? 的一部分,则它是一个“危险字符串”。

^(.)()+|()$

使用regexlib.com 上的测试仪似乎效果很好,因为它符合您所期望的所有内容,并且没有您不想要的内容。

但是当我在 ASP.NET RegularExpressionValidator 上使用表达式时,验证器会触发任何文本!无论 EnableClientScript 是真还是假,它在 Firefox 或 IE 上都是如此。我正在使用 .NET 4.5.1,但我不希望这有什么不同。 任何想法为什么以及如何修复它或为什么它不起作用?

【问题讨论】:

  • 我不确定你的意图,无论你是写这个只是作为一个练习还是你想在你的应用程序中使用它,但我建议允许输入 HTML 并集中你的根据需要努力正确编码输出。 “危险的 HTML”只有在输出不正确时才危险。请参阅OWASP XSS Cheat Sheet 了解更多信息。
  • 我想知道我是否看错了,因为我试图允许“安全”输入,但验证器匹配“不安全”输入,所以即使匹配有效,它也会精确与我想要的相反?
  • 在 ASP.NET 中,如果用户尝试提交带有潜在危险输入的表单,则会引发 HttpRequestValidationException。您可以通过关闭请求验证来阻止这种情况发生,但我不想绕过请求验证(因为这是安全性的重要部分),所以我想要一种优雅的方式来处理请求验证失败的最常见方式,以便用户可以更正输入而不是其他任何内容。我可以编写一个自定义验证器来执行此操作,但我认为正则表达式会更好。
  • 我明白了。我更喜欢把它关掉,但你必须确信你输出的东西是正确的。请参阅my other answer here 的 XSS 部分,了解有关 ASP.NET 请求验证及其易受攻击位置的一些信息。

标签: html asp.net regex validation


【解决方案1】:

我没有研究过 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

【讨论】:

  • 在其中输入 或
  • 请看我的编辑 - 我认为新的正则表达式是你所追求的
【解决方案2】:

我想这就是你要找的:

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

虽然,我不能很好地理解你的问题,所以我可能需要一些更正。

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2012-01-13
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多