【问题标题】:Can i prevent Elmah inside my asp.net mvc-4 web aplication from exposing the users' passwords我可以防止我的 asp.net mvc-4 Web 应用程序中的 Elmah 暴露用户的密码吗
【发布时间】:2020-01-11 11:15:45
【问题描述】:

当我开发我的第一个 asp.net web 应用程序时,用户收到一个异常,我认为 IIS 会有关于异常的完整详细信息,但事实并非如此。我被告知要存储任何异常信息,我可以使用对我们有用的库名称 Elmah。但是最近我检查了一个用户在登录我们的 asp.net mvc 后引发的异常,我发现 Elmah 将用户名和密码存储在 xml 文件中,如下所示:-

-<item name="__RequestVerificationToken">

<value string="X***************************81"/>

</item>


-<item name="UserName">

<value string="******"/>

</item>


-<item name="Password">

<value string="******"/>

</item>


-<item name="domains">

<value string="******"/>

</item>


-<item name="RememberMe">

<value string="true"/>

<value string="false"/>

</item>

</form>

在我们的例子中,asp.net mvc-4 提供了一个登录视图,输入使用 ldap 连接字符串连接到我们的活动目录的用户名/密码,这里是登录代码(不确定是否有帮助) :-

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


            MembershipProvider domainProvider;

            domainProvider = Membership.Providers["DomainADMembershipProvider"];
            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);
        }

这是我们web.config中的Elmah组件:-

 <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>

 <appSettings>
 <add key="elmah.mvc.disableHandler" value="false" />
    <add key="elmah.mvc.disableHandleErrorFilter" value="false" />
    <add key="elmah.mvc.requiresAuthentication" value="false" />
    <add key="elmah.mvc.IgnoreDefaultRoute" value="false" />
    <add key="elmah.mvc.allowedRoles" value="*" />
    <add key="elmah.mvc.allowedUsers" value="*" />
    <add key="elmah.mvc.route" value="elmah" />
    <add key="elmah.mvc.UserAuthCaseSensitive" value="true" />
 </appSettings>


 <httpModules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
 </httpModules>

 <modules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
 </modules>

 <elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="C:\elmaherrorlogs\" />
 </elmah>

说实话,当用户面临未处理的异常时,Elmah 帮助了我们很多,但如果没有办法防止它暴露用户的密码,那么我想我需要禁用它。

如果我们可以阻止 Elmah 在异常 xml 文件中暴露用户的密码,任何人都可以提出建议吗? 谢谢

【问题讨论】:

标签: asp.net asp.net-mvc elmah elmah.mvc


【解决方案1】:

终于找到了我们在其中一个 MVC4 项目中使用的代码。将其放入您的 Global.asax.cs 文件中:

// remove Password field from logging
// http://blog.elmah.io/removing-sensitive-form-data-before-logging-to-elmah/
public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) {
    var httpContext = e.Context as HttpContext;
    if (httpContext != null && httpContext.Request.Form.AllKeys.Any(k => k == "Password")) {
        var error = new Error(e.Exception, httpContext);
        error.Form.Set("Password", "******");
        ErrorLog.GetDefault(httpContext).Log(error);
        e.Dismiss();
    }          
}

elmah.io 上引用的博客似乎已更改,但该代码也可能有用。

【讨论】:

  • 好的,感谢您的回复,将尝试您的代码。但是您的代码适用于 MVC-4 吗?第二点,我可以做一个测试来检查密码是否不会被记录?
  • 它来自一个 MVC 4 项目。最好的验证方法是检查日志,日志中的密码值应该是星号。如果表单包含一个名为“密码”的字段,它会创建一个新的错误,在新的错误中替换该字段的值,记录新的错误并丢弃旧的错误。
  • 好的,所以会在代码中强制一个异常来测试它。但是在elmah xml错误中我发现了一些参数,例如HTTP_COOKIE&__RequestVerificationToken&.ASPXAUTH,所以我是否也应该将这些值从写入xml elmah错误文件中删除(与密码情况相同)?跨度>
  • 如果您想停止任何其他参数,您将不得不更改关键测试逻辑和文本替换代码。
  • 好吧,这只是为了阻止任何提交的表单字段,例如明文密码。您可能不得不在httpContext.Request 中四处寻找其他信息。
猜你喜欢
  • 2015-07-21
  • 2012-03-21
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多