2011-07-08 6 views
16

İşte senaryo ...MVC 3 ile ELMAH'de, hassas form verisini hata günlüğünden nasıl gizleyebilirim?

Kullanıcı, kullanıcı adını değiştirir. Bir "yanlış" şifre oluşturur. Kullanıcı adı ve parola değerleri, Exception.Context.Request.Form["Password"] aracılığıyla Elmah hata günlüğüne iletilir. Salt okunur bir değerdir ve değiştirilemez.

Ve hayır ... Özel durumu reddetmek istemiyorum (başarısız). Biz programlı ErrorLog Filtreleme ekledi:

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

Ama şifre bizim hata günlüğü gizli şekilde Request.Form değiştiremez.

Buralarda biriyle karşılaştı mı?

Temel olarak parola alanı olmayan tüm hata verilerini istiyorum. Manuel olarak kaydetmeyi düşündük, ancak bu sadece hassas verileri gizlemekle karşılaştırıldığında çok fazla iş gibi görünüyordu.

Şerefe çocuklar. Şimdiden teşekkürler.

+0

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

+0

http://myitforum.com/cs2/blogs/ maikkoster/arşivi/2010/07/12/elmah-a-harika bir şekilde-sorun giderme-web-applications.aspx –

+1

@ 0A0D ??? Sağol kanka. Sadece iyi çalışıyor .... ama gönderilmekte olan değerlerin bazılarını nasıl gizlediğimi bilmiyorum. TGIF'i biraz erken mi başlattın? ;-) – willis

cevap

0

Kaynağı kendisi değiştirmedikçe bunu yapamazsınız. Yapılandırmayı kesinlikle değiştirebilir ve "Hariç Tutulan Form Öğeleri" kavramını buna ekleyebilir, daha sonra Hata sınıfı koleksiyonu HttpContext'ten kopyalarsa, o listedeki öğeleri kaldırabilirsiniz. Başka bir alternatif, açık bir şekilde, EntLib veya log4net gibi günlüğe kaydetme işlemi üzerinde daha açık bir denetim sağlayan başka bir şey kullanmak olabilir. Bu araçlardan birini kullanmak için bir modül veya global bir istisna eylemcisi yazmak çok önemlidir. Ayrıca, web uygulamalarının dışında kapsamlar ile ilgilidir.

2

Yakalama istisna sonra böyle elle ELMAH bir şey yapın:


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

İstek üzerine Form koleksiyonu değiştiremez ancak bir Elmalı Hata isntance form koleksiyonu değiştirebilir ve daha sonra yapabilirsiniz manuel olarak oturum açın. Yani

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

Sonra Global.asax

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

@Matt Murphy'nin yaklaşımını çektim ve santrifüj yapmak istediğiniz verileri belirtmek için bir ActionFilterAttribute yarattı, bkz. Https: // github.com/appclay/ElmahSensitiveDataFiltering (şimdiye kadar sadece MVC3 ve 4 için) – joshuahealy

+0

Sonra nasıl Elmah.ErrorSignal.FromCurrentContext() Raise() yapacak bir e-posta gönderirsiniz? – spankmaster79

+0

Ayrıca "Uygula" yöntemini filtrelemeye devam etmeden önce e.Dismissed öğesinin true olup olmadığını kontrol etmek isteyebilirsiniz - bu şekilde filtrelemeyi web.config ( öğesi aracılığıyla) yerine uygun şekilde yapabilirsiniz. Burada soru: https://stackoverflow.com/questions/44524246/error-filters-in-web-config-are-ignored-when-using-errorlog-filtering-with-elmah/44525607 – DanP

İlgili konular