2011-07-08 10 views
16

Oto scenariusz ...W programie ELMAH z MVC 3, Jak mogę ukryć dane wrażliwe formularza z dziennika błędów?

Typ użytkownika jego nazwa użytkownika. Typuje "nieprawidłowe" hasło. Obie wartości nazwy użytkownika i hasła są przesyłane do dziennika błędów Elmah poprzez Exception.Context.Request.Form["Password"]. Jest to wartość tylko do odczytu i nie można jej modyfikować.

I nie ... Nie chcę odrzucać wyjątku (niepowodzenie). Dodaliśmy ErrorLog Filtering programowo:

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

Ale nie może zmodyfikować Request.Form tak, że hasło jest ukryte przed naszym dzienniku błędów.

Ktoś zetknął się z tym sposobem?

Zasadniczo chcę wszystkich danych błędu bez pola hasła. Rozważaliśmy ręczne logowanie, ale wydawało się, że jest to dużo pracy w porównaniu do ukrywania wrażliwych danych.

Pozdrawiamy facetów. Z góry dziękuję.

+0

http://kurtschindler.net/blog/post/Configuring-ELMAH-on-DiscountASPNET –

+0

http://myitforum.com/cs2/blogs/ maikkoster/archive/2010/07/12/elmah-a-great-of-rozwiązywanie problemów-web-applications.aspx –

+1

@ 0A0D ??? Dzięki stary. Działa to dobrze ... ale nie wiem, jak ukryć niektóre wartości, które zostaną opublikowane. Czy uruchomiłeś TGIF nieco za wcześnie? ;-) – willis

Odpowiedz

0

Nie możesz tego zrobić, dopóki nie zmodyfikujesz samego źródła. Można oczywiście zmodyfikować konfigurację i dodać do niej pojęcie "elementów wykluczonych", a następnie, gdy klasa Error skopiuje kolekcję z HttpContext, można usunąć wszystkie elementy z tej listy.

Inną alternatywą byłoby użycie czegoś innego, co oczywiście zapewnia bardziej wyraźną kontrolę nad procesem rejestrowania, takim jak EntLib lub log4net. Łatwo jest napisać moduł lub globalną procedurę obsługi wyjątków, aby wykorzystać jedno z tych narzędzi. Co więcej, są one istotne w zakresach poza aplikacjami internetowymi.

2

połowu wyjątek, a następnie zalogować się coś w ELMAH ręcznie, tak:


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

Nie można modyfikować kolekcji formularz na zamówienie, ale można modyfikować kolekcji formularz na błąd isntance ELMAH a następnie ręcznie zalogować. To znaczy.

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

Następnie w Global.asax

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

Podjęto podejście @Matt Murphy i stworzył ActionFilterAttribute, aby określić dane, które chcesz santise, patrz https: // github.com/appclay/ElmahSensitiveDataFiltering (jak dotąd tylko w przypadku MVC3 i 4) – joshuahealy

+0

w jaki sposób wysyłasz wiadomość e-mail, którą Elmah.ErrorSignal.FromCurrentContext() zrobi funkcja Raise()? – spankmaster79

+0

Możesz również sprawdzić, czy e.Dyskotsed jest prawdziwe, zanim przejdziesz do filtrowania również w metodzie "Zastosuj" - w ten sposób możesz uszanować filtrowanie w web.config (poprzez element ) - zobacz moje powiązane pytanie tutaj: https://stackoverflow.com/questions/44524246/error-filters-in-web-config-are-ignored-when-using-errorlog-filtering-with-elmah/44525607 – DanP

Powiązane problemy