【问题标题】:How i can allow passing passwords that contain unsafe words我如何允许传递包含不安全单词的密码
【发布时间】:2019-02-04 21:11:36
【问题描述】:

我正在开发一个 asp.net MVC4 Web 应用程序,对于登录,我使用的是使用 LDAP 连接字符串连接到我们的 AD 的表单身份验证,如下所示。 登录Get操作方法:-

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    returnUrl = TempData["returnUrl"] != null ? TempData["returnUrl"].ToString() : String.Empty;
    List<String> domains = new List<String>();
    domains.Add("*****");
    ViewBag.ReturnUrl = returnUrl;
    ViewBag.Domains = domains;
    return View();
}

Login Post 操作方法:-

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    MembershipProvider domainProvider;
    domainProvider = Membership.Providers["TestDomain1ADMembershipProvider"];
    if (ModelState.IsValid)
    {
        // Validate the user with the membership system.
        if (domainProvider.ValidateUser(model.UserName, model.Password))
        {  
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
        }
        else
        {
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
            List<String> domains2 = new List<String>();
            domains2.Add("****");
            ViewBag.Domains = domains2;
            return View(model);
        }

        return RedirectToLocal(returnUrl);
    }
    List<String> domains = new List<String>();
    domains.Add("****");
    ViewBag.Domains = domains;
    return View(model);
}

现在我已经使用这个系统 5 年了,从来没有遇到过用户登录的任何问题。但是今天一个新用户提到,当他尝试登录系统时,他会收到一个错误“处理您的请求时出错。”,如果出现未处理的异常,我们的系统会引发此错误被抚养。我检查了 IIS 日志,我可以看到用户没有访问系统。

所以我能想到的唯一问题是用户的密码包含 MVC 不允许的字符。例如,我尝试输入此密码 &lt;script&gt;@1234 以及我的用户名,而不是收到此消息“提供的用户名或密码不正确。”,我得到了相同的异常“处理您的请求时出错。".. 当然我不能要求用户提及他的密码,但我不确定如何允许 MVC 接受传递给它的任何密码?因为我想不出任何其他问题......因为通常当用户登录到应用程序时,他们要么;登录成功或得到“提供的用户名或密码不正确”。 ,但我从来没有遇到过用户遇到异常的问题......我可以通过传递不安全的字符来复制它&lt;script&gt;@1234

【问题讨论】:

  • Login(LoginModel, string) 方法中设置断点并验证模型是否被正确序列化。这可能是 MVC 而不是 AD/LDAP 中的问题。如果它 AD 的问题,它可能会在ValidateUser 抛出一个异常,该异常隐藏在通用HTTP 500 错误后面。您可能可以通过添加 try/catch 块并检查/记录异常来获取更多信息。
  • @p.s.w.g 当我在 Visual Studio 中调试应用程序并输入以下密码 &lt;script&gt; 后登录操作方法 Login(LoginModel, string) 上的断点将无法到达。相反,我会得到以下异常A potentially dangerous Request.Form value was detected from the client (Password="&lt;script&gt;"). 当然如果在实时服务器上引发此错误,用户将得到Error while processing ....
  • .. 那么我可以允许Login(LoginModel, string) post 操作方法接受不安全的字符吗?

标签: asp.net asp.net-mvc asp.net-mvc-4 ldap


【解决方案1】:

在您的LoginModel 中,将AllowHtmlAttribute 添加到Password 字段。这将绕过对 &lt;script&gt; 等输入的检查。

[AllowHtml]
public string Password { get; set; }

当然,请谨慎使用。 MVC 试图保护您免受脚本注入攻击,因此您应该只在可以确保安全处理值的少数情况下禁用此检查。 (在这种情况下,密码永远不应该显示给用户,因此即使其中有 HTML,它也无法将 HTML 注入到页面中。

或者,如果您无法更改 LoginModel 类,您可以尝试将 ValidateInputAttribute 添加到您的 Login POST 方法中。

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
[ValidateInput(false)]
public ActionResult Login(LoginModel model, string returnUrl)

【讨论】:

  • 感谢您的回复...现在我可以访问所有课程,但您更喜欢哪种方法?使用[AllowHtml][ValidateInput(false)]?第二个问题,现在一般来说,AD里面的密码可以包含不能传递给MVC的字符吗?如果答案是肯定的,那么我肯定需要按照您的回复中提到的那样修改我的应用程序,即使它与我当前的问题无关。这是正确的吗?因为如果用户的密码包含 MVC 认为不安全的字符,我的应用程序会出现问题?
  • @testtest 我更喜欢[AllowHtml],因为它只删除了那个属性的输入验证。对于你的第二个问题,我不知道任何这样的字符,但你可能想尝试各种控制字符(退格、空字符等)来确定。另一方面,如果有人真的在使用控制字符,那么他们很可能正在做一些可疑的事情。
  • 好的,但最后我不允许用户创建包含不安全单词的密码,我只想让他们登录到我的应用程序.. 因为我不打算存储密码或显示给任何用户,所以我认为仅在密码变量上使用 [AllowHtml] 仍然被认为是安全的。否则用户将无法登录系统...
  • 正确。这个问题让我意识到我可能也应该在我的 MVC 应用程序中使其成为标准做法。密码通常包含在其他地方可能被认为不安全的字符和模式,应该比其他文本输入更宽松地处理它们。
  • 是的,从我这边也是.. 但奇怪的是我没有在 stackoverflow 上找到任何文章或类似问题,我的意思是似乎以前没有人遇到过这个问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2012-09-01
  • 2011-01-03
  • 1970-01-01
相关资源
最近更新 更多