【问题标题】:In ELMAH with MVC 3, How can I hide sensitive form data from the error log?在带有 MVC 3 的 ELMAH 中,如何从错误日志中隐藏敏感的表单数据?
【发布时间】:2011-10-01 11:39:52
【问题描述】:

这里是场景...

用户键入他的用户名。键入“不正确”的密码。 用户名和密码值都被传递到 Elmah 错误日志 通过Exception.Context.Request.Form["Password"]。 这是一个只读值,不能修改。

不...我不想忽略异常(失败)。我们以编程方式添加了 ErrorLog 过滤:

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 以使密码从我们的错误日志中隐藏。

有人遇到过解决方法吗?

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

干杯,伙计们。提前致谢。

【问题讨论】:

  • @0A0D ???谢谢哥们。它工作得很好......但我不知道如何隐藏一些发布的值。你开始 TGIF 是不是有点太早了? ;-)
  • @0AOD 哦...我明白你的意思。我已经在这样做了。但我想保护他们免受管理员和开发人员的影响。我知道...我非常小心...但现在你永远不知道。
  • @0A0D - 我认为 OP 并没有试图过滤掉错误,而是在 ELMAH 将其存储在错误日志中之前拦截它们并更改发布的表单数据。我也很想知道这一点。

标签: c# security asp.net-mvc-3 forms-authentication elmah


【解决方案1】:

您不能在请求中修改表单集合,但您可以在 Elmah 错误实例上修改表单集合,然后手动记录它。 IE。

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);
}

【讨论】:

  • 我采用了@Matt Murphy 的方法并创建了一个 ActionFilterAttribute 来指定您想要清理的数据,请参阅github.com/appclay/ElmahSensitiveDataFiltering(目前仅适用于 MVC3 和 4)
  • 你如何发送一封 Elmah.ErrorSignal.FromCurrentContext().Raise() 会做的电子邮件?
  • 您可能还想检查 e.Dismissed 是否为真,然后再继续在“应用”方法中进行过滤 - 这样您就可以尊重 web.config 中的过滤(通过 元素)——在这里查看我的相关问题:stackoverflow.com/questions/44524246/…
【解决方案2】:

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


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

【讨论】:

  • 如果错误不是密码错误怎么办?如果是数据库超时怎么办?如果是网络错误或其他错误怎么办?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多