2011-07-08 25 views
16

這裏是場景...在使用MVC 3的ELMAH中,如何隱藏錯誤日誌中的敏感表單數據?

用戶鍵入他的用戶名。輸入「不正確」的密碼。 用戶名和密碼值都通過Exception.Context.Request.Form["Password"]傳遞給Elmah錯誤日誌 。 這是一個只讀值,不能修改。

而且......我不想排除異常(失敗)。我們以編程方式添加了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,以便密碼從我們的錯誤日誌中隱藏。

有沒有人遇到過這種方法?

我基本上想要所有沒有密碼字段的錯誤數據。我們認爲手動記錄它,但與簡單地隱藏敏感數據相比,這似乎有很多工作。

乾杯傢伙。提前致謝。

+0

http://kurtschindler.net/blog/post/Configuring-ELMAH-on-DiscountASPNET – 2011-07-08 17:55:58

+0

http://myitforum.com/cs2/blogs/ maikkoster/archive/2010/07/12/elmah-a-great-way-of-troubleshooting-web-applications.aspx – 2011-07-08 17:56:58

+1

@ 0A0D ???謝謝哥們。它工作得很好....但我不知道如何隱藏一些發佈的值。你開始TGIF有點過早了嗎? ;-) – willis

回答

0

除非您修改源本身,否則無法執行此操作。您當然可以修改配置並在其中添加「排除的表單元素」的概念,然後當Error類從HttpContext中複製集合時,您可以刪除該列表中的任何項目。

另一種替代方法是使用別的東西,顯然,它提供了對EntLib或log4net等日誌過程的更明確的控制。編寫一個模塊或全局異常處理程序來利用其中一種工具是很簡單的。而且,它們與Web應用程序之外的範圍相關。

2

捕獲異常,然後手動登錄東西ELMAH,像這樣:


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

不能修改請求的形式收集,但你可以修改的ELMAH錯誤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

我採取了@Matt Murphy的方法並創建了一個ActionFilterAttribute來指定你想要的數據,參見https:// github。com/appclay/ElmahSensitiveDataFiltering(到目前爲止僅適用於MVC3和4) – joshuahealy

+0

然後您如何發送Elmah.ErrorSignal.FromCurrentContext()。Raise()會執行的電子郵件? – spankmaster79

+0

您也可以在繼續在「應用」方法中過濾之前檢查e.Dismissed是否爲真 - 這樣您就可以在web.config中(通過元素)尊重過濾 - 請參閱我的相關信息問題在這裏:https://stackoverflow.com/questions/44524246/error-filters-in-web-config-are-ignored-when-using-errorlog-filtering-with-elmah/44525607 – DanP