2010-08-27 78 views
3

我們有一些錯誤報告代碼,當發生未處理的異常時,我們會通過電子郵件將所有內容發送給我們的組。除非在帶有密碼字段的頁面上發生未處理的異常,否則它將以純文本形式發送。最乾淨的方式來隱藏密碼輸入字段?

有沒有辦法通過Request.Form迭代並找出哪些項目是密碼?這是在低級別完成的,所以我們無法查找特定的控件。

當然,我們可以檢查輸入框是什麼類型,但我不確定這是否是最乾淨的方式。建議嗎?

+1

您可以在名稱中查找帶有「密碼」的項目。不完全是最乾淨的方式。 – Jerome 2010-08-27 14:53:47

+0

你能加密所有密碼嗎? – Kyle 2010-08-27 15:01:22

+0

我們有數百個遺留頁面,並不是所有的名稱都有密碼。 Kyle,我不確定你在暗示什麼。您是否要在發佈到Web服務器之前加密客戶端的密碼?加密是一個雙向的街道,我不覺得舒服的發送電子郵件... – Kris 2010-08-27 15:14:36

回答

2

使用您想發送電子郵件的字段名稱的白名單。

可能有數百個字段名稱被髮送到您的服務器。密碼不是唯一敏感的字段。根據您的應用程序,可能會有其他一些事情需要謹慎對待。

因此,請列出一些字段名稱,以幫助您進行調試。這些通常是唯一的標識符/數據庫密鑰等。如果您在此列表中有任何參數名稱,則可以將其包含在電子郵件中。

+0

這似乎是唯一的方法來解決這個=/ 我希望有一種方法來確定後面的代碼中的輸入類型。 – Kris 2010-08-27 15:24:27

+1

@Kris - 你不能。該字段的類型不會發送到HTTP請求中的服務器。它是一個黑名單(不要發送密碼或密碼或PASSWORD);或白名單(只發送UserID和ProjectID和SomeOtherProjectSpecificID)...我個人更喜歡白名單,因爲它更安全。 – 2010-08-27 15:34:51

0

最簡潔的方法是檢查輸入元素的type屬性。

HTML5規範has this說一下input type=password

與一種類型的屬性的值是「口令」表示用於輸入密碼的一個行純文本編輯控制輸入元件。

數據類型:文本沒有換行符(敏感信息)
控制類型:該遮蔽數據輸入

這是來自所有用戶代理implmentations強制性要求文本字段,和它自HTML 2以來一直如此。所以這確實是最乾淨的方式來做你想做的事情。

如果你想這樣做在客戶端(你所提到的數據發送到服務器),那麼它是相對容易:

function hidePasswords() { 
    var inputs = document.getElementsByTagName('input'); 
    for (var i = 0; i < inputs.length; ++i) 
     if (inputs[i].type == 'password') input[i].value = '*****'; 
} 
+0

呃,我知道輸入類型是密碼。你究竟可以在ASP.Net中檢查這個問題是我所問的。據我所知你不能訪問輸入元素,除非他們有一個runat =服務器設置,我不能保證每個使用這個邏輯的頁面都這樣做。 – Kris 2010-08-27 15:13:14

+0

我看到了你的編輯。不確定如何將它們隱藏在客戶端會有所幫助;除非您通過AJAX發送,否則您永遠不會在後端收到密碼。 – Kris 2010-08-27 15:16:49

+0

糟糕,我在上面編輯了我的答案,並在添加評論的同時添加了一個示例,說明如何在客戶端執行此操作。 除非您使用某種類型的HTTP通道安全性(如HTTPS),否則密碼將始終以未加密方式發送,無論您是否有錯誤。 我誤解了什麼嗎? – 2010-08-27 15:17:50

0

由於Jerome already pointed out in the comments,只是保持你的密碼的名稱軌道輸入字段並在發送錯誤/例外報告之前對其進行過濾。由於未提交輸入字段的類型,因此這是最佳解決方案。

0

一些解決方案,但我不知道怎麼亮他們中任何一個:

1)在頁面維護是密碼輸入控件ID列表,通過這個列表與異常處理程序期望忽略這些領域。

2)請列出頁面名稱,一個字段id網站的資源文件,並有此資源文件中的異常處理程序檢查,如果該異常相關的ResourceManager(可能無法正常工作)

3 )像想法2一樣保留數據庫表。存在相同的問題。

2

我已經提出過不同的解決方案,但我認爲你要在客戶端處理這個問題。按照你的意見,我現在明白你需要在服務器端處理這個問題。可能有辦法讓你這樣做,但它不是很優雅,但它應該工作:

向所有頁面添加一個腳本,收集所有密碼字段名稱到一個新的客戶端生成的字段,如下所示:

function collectPasswordFields() { 
    var inputs = document.getElementsByTagName('input'), list = []; 
    for (var i = 0; i < inputs.length; ++i) 
     if (inputs[i].type == 'password') list.push(inputs[i].name); 
    var field = document.createElement('input'); 
    field.name = '__password_fields'; 
    field.value = list.join(','); 
    document.getElementsByTagName('form')[0].appendChild(field); 
} 

然後攔截服務器端錯誤處理程序中的附加字段,並從電子郵件中刪除指定的字段。

可以這樣的工作嗎?

+0

這很聰明。你是對的,不是優雅而是有趣的。不幸的是,它不適用於我們的許多遺留頁面,但非常漂亮。 – Kris 2010-08-27 15:46:22