Подтвердить что ты не робот

В ELMAH с MVC 3, как я могу скрыть данные конфиденциальной формы из журнала ошибок?

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

Пользователь вводит имя пользователя. Тип "неверный" пароль. И значения имени пользователя и пароля передаются в журнал ошибок Elmah через Exception.Context.Request.Form["Password"]. Это значение только для чтения и не может быть изменено.

И нет... Я не хочу отклонять исключение (fail). Мы добавили программную фильтрацию ошибок:

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, чтобы пароль был скрыт от нашего журнала ошибок.

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

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

Приветствия ребята. Спасибо заранее.

4b9b3361

Ответ 1

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

Ответ 2

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


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

Ответ 3

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

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