В ELMAH с MVC 3, как я могу скрыть конфиденциальные данные формы из журнала ошибок? - PullRequest
16 голосов
/ 08 июля 2011

Вот сценарий ...

Пользователь вводит свое имя пользователя. Типы "неверный" пароль. И имя пользователя, и пароль передаются в журнал ошибок 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
  }
}

Но нельзя изменить форму Request.Form, чтобы пароль был скрыт в нашем журнале ошибок.

Кто-нибудь когда-нибудь сталкивался с этим?

Я в основном хочу все данные об ошибках без поля пароля. Мы подумали о том, чтобы зарегистрировать его вручную, но это казалось большой работой по сравнению с простым сокрытием конфиденциальных данных.

Приветствия, ребята. Заранее спасибо.

Ответы [ 3 ]

13 голосов
/ 11 марта 2013

Вы не можете изменить коллекцию форм по запросу, но вы можете изменить коллекцию форм в 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);
}
1 голос
/ 31 августа 2011

Перехватите исключение, затем зарегистрируйте что-нибудь в ELMAH вручную, например:


catch (LogOnException e)
{
     Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception("Bad Password"));
}
0 голосов
/ 06 августа 2011

Вы не можете сделать это, если не измените сам источник. Вы, конечно, можете изменить конфигурацию и добавить к ней понятие «исключенные элементы формы», а затем, когда класс Error копирует коллекцию из HttpContext, вы можете удалить любые элементы в этом списке.

Другой альтернативой может быть использование чего-то другого, очевидно, которое обеспечивает более явный контроль над процессом регистрации, например, EntLib или log4net. Создать модуль или глобальный обработчик исключений тривиально, чтобы использовать любой из этих инструментов. Более того, они актуальны в областях вне веб-приложений.

...