在带有MVC 3的ELMAH中,如何隐藏错误日志中的敏感表单数据?

wil*_*lis 16 c# security forms-authentication elmah asp.net-mvc-3

这是场景......

用户输入他的用户名.键入"不正确"的密码.用户名和密码值都通过传递给Elmah错误日志Exception.Context.Request.Form["Password"].它是只读值,无法修改.

并且没有...我不想解雇异常(失败).我们以编程方式添加了ErrorLog Filtering:

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
  if (e.Exception is LogOnException)
  {
    ((HttpContext) e.Context).Request.Form.Remove("Password");
    // This is what we want to do, but we can't because it is read-only
  }
}
Run Code Online (Sandbox Code Playgroud)

但无法修改Request.Form,以便从我们的错误日志中隐藏密码.

有没有人遇到过这种方法?

我基本上想要没有密码字段的所有错误数据.我们考虑手动记录它,但与简单地隐藏敏感数据相比,这似乎是很多工作.

干杯伙计们.提前致谢.

Mat*_*phy 13

您无法修改请求中的表单集合,但您可以修改Elmah Error isntance上的表单集合,然后手动记录它.即

public static class ElmahSensitiveDataFilter
{
  public static void Apply(ExceptionFilterEventArgs e, HttpContext ctx)
  {
    var sensitiveFormData = ctx.Request.Form.AllKeys
            .Where(key => key.Equals("password", StringComparison.OrdinalIgnoreCase)).ToList();
    if (sensitiveFormData.Count == 0)
    {
      return;
    }
    var error = new Error(e.Exception, ctx);
    sensitiveFormData.ForEach(k => error.Form.Set(k, "*****"));
    Elmah.ErrorLog.GetDefault(null).Log(error);
    e.Dismiss();
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在Global.asax中

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    var ctx = e.Context as HttpContext;
    if(ctx == null)
    {
      return;
    }
    ElmahSensitiveDataFilter.Apply(e, ctx);
}
Run Code Online (Sandbox Code Playgroud)


小智 -1

除非修改源本身,否则无法执行此操作。您当然可以修改配置并向其中添加“排除的表单元素”的概念,然后当 Error 类从 HttpContext 复制集合时,您可以删除该列表中的任何项目。

显然,另一种选择是使用其他东西,它可以对日志记录过程提供更明确的控制,例如 EntLib 或 log4net。编写模块或全局异常处理程序来利用这些工具中的任何一个都很简单。此外,它们与 Web 应用程序之外的范围相关。