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

这是场景……

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

不…我不想解雇exception(失败)。 我们以编程方式添加了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 } } 

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

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

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

干杯伙计们。 提前致谢。

您无法修改请求中的表单集合,但您可以修改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(); } } 

然后在Global.asax中

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

捕获exception,然后手动在ELMAH中记录一些内容,如下所示:

 catch (LogOnException e) { Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Bad Password")); } 

除非您修改源本身,否则不能这样做。 您当然可以修改配置并添加“Excluded Form Elements”的概念,然后当Error类从HttpContext复制集合时,您可以删除该列表中的任何项目。

另一种选择是使用其他东西,显然,它提供了对EntLib或log4net等日志记录过程的更明确的控制。 编写模块或全局exception处理程序来使用其中一个工具是微不足道的。 此外,它们与Web应用程序之外的范围相关。