2011-07-08 20 views
16

Đây là trường hợp ...Trong ELMAH với MVC 3, Làm cách nào để ẩn dữ liệu biểu mẫu nhạy cảm khỏi nhật ký lỗi?

Người dùng nhập tên người dùng của mình. Nhập mật khẩu "không chính xác". Cả hai giá trị tên người dùng và mật khẩu đang được chuyển đến nhật ký lỗi Elmah qua Exception.Context.Request.Form["Password"]. Đó là giá trị chỉ đọc và không thể sửa đổi được.

Và không ... Tôi không muốn loại bỏ ngoại lệ (không thành công). Chúng tôi đã thêm Bộ lọc ErrorLog theo chương trình:

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

Nhưng không thể sửa đổi Request.Form để mật khẩu bị ẩn khỏi nhật ký lỗi của chúng tôi.

Bất kỳ ai đã từng gặp phải một con đường xung quanh vấn đề này?

Tôi về cơ bản muốn tất cả dữ liệu lỗi mà không có trường mật khẩu. Chúng tôi coi việc đăng nhập theo cách thủ công nhưng điều đó dường như có nhiều công việc so với việc chỉ ẩn dữ liệu nhạy cảm.

Chúc mừng các bạn. Cảm ơn trước.

+0

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

+0

http://myitforum.com/cs2/blogs/ maikkoster/archive/2010/07/12/elmah-a-great-way-of-khắc phục sự cố-web-applications.aspx –

+1

@ 0A0D ??? Cảm ơn cậu. Nó hoạt động tốt ... nhưng tôi không biết làm thế nào ẩn một số giá trị được đăng. Bạn đã bắt đầu TGIF một chút quá sớm? ;-) – willis

Trả lời

0

Bạn không thể thực hiện việc này trừ khi bạn sửa đổi chính nguồn. Bạn chắc chắn có thể sửa đổi cấu hình và thêm khái niệm "Phần tử biểu mẫu bị loại trừ" vào đó, khi lớp Lỗi sao chép bộ sưu tập từ HttpContext, bạn có thể xóa bất kỳ mục nào trong danh sách đó.

Một giải pháp thay thế khác là sử dụng một cái gì đó khác, hiển nhiên, cung cấp khả năng kiểm soát rõ ràng hơn đối với quy trình ghi nhật ký như EntLib hoặc log4net. Nó là tầm thường để viết một mô-đun hoặc xử lý ngoại lệ toàn cầu để sử dụng một trong những công cụ đó. Hơn nữa, chúng có liên quan trong phạm vi bên ngoài các ứng dụng web.

2

Săn ngoại lệ, sau đó đăng nhập cái gì đó trong ELMAH bằng tay, như thế này:


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

Bạn không thể sửa đổi các bộ sưu tập mẫu trên yêu cầu nhưng bạn có thể thay đổi bộ sưu tập hình thức trên một Lỗi ELMAH isntance và sau đó tự đăng nhập nó. I E.

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

Sau đó, trong Global.asax

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

Tôi đã tiếp cận phương pháp của @Matt Murphy và tạo một ActionFilterAttribute để chỉ định dữ liệu mà bạn muốn santise, xem https: // github.com/appclay/ElmahSensitiveDataFiltering (cho đến nay đối với MVC3 và 4 chỉ) – joshuahealy

+0

làm thế nào để bạn sau đó gửi một email mà Elmah.ErrorSignal.FromCurrentContext(). Raise() sẽ làm gì? – spankmaster79

+0

Bạn cũng có thể kiểm tra xem e.Dismissed có đúng hay không trước khi tiếp tục lọc theo phương thức "Áp dụng" - theo cách này bạn có thể tôn trọng lọc trong web.config (thông qua phần tử ) - xem liên quan của tôi câu hỏi ở đây: https://stackoverflow.com/questions/44524246/error-filters-in-web-config-are-ignored-when-using-errorlog-filtering-with-elmah/44525607 – DanP

Các vấn đề liên quan