Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在使用MVC3的ELMAH中,如何从错误日志中隐藏敏感表单数据?_C#_Security_Asp.net Mvc 3_Forms Authentication_Elmah - Fatal编程技术网

C# 在使用MVC3的ELMAH中,如何从错误日志中隐藏敏感表单数据?

C# 在使用MVC3的ELMAH中,如何从错误日志中隐藏敏感表单数据?,c#,security,asp.net-mvc-3,forms-authentication,elmah,C#,Security,Asp.net Mvc 3,Forms Authentication,Elmah,下面是一个场景 用户输入他的用户名。键入“不正确”的密码。 用户名和密码值都被传递到Elmah错误日志 通过Exception.Context.Request.Form[“Password”]。 它是只读值,无法修改 不。。。我不想忽略这个例外(失败)。我们以编程方式添加了ErrorLog筛选: void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) { if (e.Exception is LogOnExcept

下面是一个场景

用户输入他的用户名。键入“不正确”的密码。 用户名和密码值都被传递到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,因此密码将从错误日志中隐藏

有人遇到过解决这个问题的方法吗

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


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

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


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

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


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

您不能在请求中修改表单集合,但可以在Elmah错误提示中修改表单集合,然后手动记录。即

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

@0A0D???谢谢你,伙计。它工作得很好。。。。但我不知道如何隐藏一些发布的值。你开始TGIF有点太早了吗?;-)@哦。。。我支持你的观点。我已经在做了。但是我想从管理员和开发人员那里保护它们。我知道。。。我非常小心。。。但是现在你永远不会知道。@0A0D-我认为OP不是试图过滤错误,而是在ELMAH将其存储在错误日志中之前拦截它们并更改发布的表单数据。我也很想知道这一点。我采用了@Matt Murphy的方法,创建了一个ActionFilterAttribute来指定要存储的数据,请参见(目前仅适用于MVC3和MV4)如何发送一封电子邮件,其中Elmah.ErrorSignal.FromCurrentContext().Raise()可以吗?在继续使用“Apply”方法进行筛选之前,您可能还想检查e.discomered是否为true-这样您就可以尊重web.config中的筛选(通过元素)——请参阅我的相关问题:如果错误不是错误密码怎么办?如果是数据库超时怎么办?如果这是一个网络错误或只是一些其他的错误呢?