在允许更广泛的输入范围之后,正确验证危险字符MVC模型字段的方法

NP8*_*P83 2 asp.net passwords validation asp.net-mvc

我们的初步情况:

  • 我们的网站上有ClientValidationEnabled = true
  • 我们正在使用MVC 5并且有一个用户名+密码的模型
  • 我们需要在密码中允许'<''>'因为数据被发送到另一个允许更广泛字符的现有系统.

当提交密码(例如'<special password>')时,抛出HttpRequestValidationException.

问题描述:

我们只允许在模型的密码属性中添加其他字符.

目前发现的方法:

  • 禁用级别上的验证(整体,页面或仅特定方法).缺点:这适用于输入中的所有字段(甚至更多取决于所选的级别).
  • 不使用模型并直接使用表单字段并使用此方法:其他问题 - > 延迟("延迟")请求验证
  • 按照Greg的建议指定[AllowHtml]

题:

这两种方法都需要对未经验证的字段进行额外验证.对于这些验证,我们可以编写自定义验证,但我们更喜欢使用现有的众所周知的解决方案.

验证该领域有什么好的建议吗?

Gre*_*reg 6

我有一个MVC 5应用程序,你的问题让我感兴趣做一些测试.当它转向时,使用"<"和">"符号的许多值都可以正常工作.

  • 例如,密码>,密码<>,密码/> 都被忽略
  • 而<密码和<密码> 导致问题

所以,真的只有这些字符的密码子集会让你感到悲伤.

您已经提到过快速而肮脏的解决方案,只需在控制器操作级别关闭此功能:

[HttpPost, ValidateInput(false)]
public ActionResult SomeAction(SomeModel model)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但我认为你真正想做的是为单个字段禁用此功能.这可以通过使用模型中给定属性的[AllowHtml]标记来完成.

[AllowHtml]
public string Password{ get; set; }
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/system.web.mvc.allowhtmlattribute(v=vs.118).aspx

假设您有自己的登录表,并且正在为您的模型使用实体框架生成的类,那么这可以作为元数据应用于同一名称空间中的另一个部分类.

namespace MyProject.Models
{
    [MetadataType(typeof(UserMetaData))]
    public partial class User
    {
    }

    public class UserMetaData
    {
        [AllowHtml]
        public string Password { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,一旦你把这一切都搞定了,我注意到了一种奇特的行为.如果我在密码中允许这些特殊字符,并且登录失败并返回到登录页面,则返回空白页面...好像还有其他安全功能我正在点击.然而,我仍然可以登录包含特殊字符的登录而没有问题......

因此,我最终必须让我的登录操作始终重定向到另一个操作(即使在这些失败时),以防止在登录尝试失败时包含密码的奇数球特殊字符导致空白页面.