【问题标题】:How can I bypass request validation for a single field?如何绕过单个字段的请求验证?
【发布时间】:2012-08-17 11:00:50
【问题描述】:

我可以看到在这个 XSS 和其他黑客攻击的时代需要验证请求。 但这可能有点矫枉过正,就像砍掉孩子的腿以确保他不会跑到路上被杀。

我们收到投诉称无法设置像 <password> 这样的密码。 据我所知,解决此问题的唯一方法是在一大堆页面上设置ValidateRequest="false"(例如注册、登录、重置密码)。而在使用.NET 4.0时,还需要为整个应用设置<httpRuntime requestValidationMode="2.0" />

这真的是唯一的方法吗?有没有办法说只有密码字段不应该被验证?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    在 asp.net 4 中,您可以创建自定义服务器端请求验证器,它可能会接受此类非典型请求。写一个很容易,第一个谷歌示例应该让您开始编写自己的:

    http://jefferytay.wordpress.com/2010/04/15/creating-your-own-custom-request-validation/

    【讨论】:

    • 谢谢,可以。可以在MSDN 找到更接近我需要的示例。我们目前仍在使用 .NET 2.0,但计划在下雨天迁移到 4.0,因此这将成为一个不错的选择。
    • 顺便说一句,“这样的非典型请求”?仅仅因为用户想要在密码中包含< 而不想显示错误页面有什么不典型的?
    • 这是因为默认验证器的行为方式。你的要求没有错。默认验证器的假设是任何类似于脚本的东西都是可能的威胁。有点偏执。
    • 这对我在 Web 应用程序中安全处理 GS1 组分隔符 非常有用。
    【解决方案2】:

    在 ASP.Net MVC 中,您现在有 the following options 用于禁用请求验证:

    禁用对控制器操作的请求验证:

    [ValidateInput(false)]
    ActionResult SomeAction(string validationIgnored){...}
    

    在(视图)模型上的属性上:

    [AllowHtml]
    string SomeProperty {get; set;}
    

    或在已发布的表单字段上使用Request.Unvalidated()

    var rawField = Request.Unvalidated().Form["field"];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多