2015-04-21 76 views
1

對於記錄事務的目的,我需要告訴用戶是否提供必要的字段/信息。 如果是,我會用*替換真實的信息。 如果不是,我會將此請求作爲失敗的請求返回「false」值。如何清理/隱藏C#中的敏感數據

以下是數據定義類和方法。

public class CreditCard 
{ 
public string brand { get; set; } 
public string billingphone { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    CreditCard creditcard =new CreditCard(){brand="VISA", billingphone="777-111-2222"}; 
    bool IsVerified= SanitizePaymnetData(creditcard);   
    } 

    private bool SanitizePaymnetData(ref CreditCard creditcard) 
    { 
     bool isDataSanitized = true; 

     if(!String.IsNullOrEmpty(creditcard.brand)) 
     { 
      creditcard.brand ="*";    
     } 
     else 
     { 
      isDataSanitized = false; 
     } 

     if (!String.IsNullOrEmpty(creditcard.billingphone)) 
     { 
      creditcard.billing_phone = "*"; 
     } 
     else 
     { 
      isDataSanitized = false; 
     } 

     return isDataSanitized; 
    } 
} 

「SanitizePaymentData」方法看起來有點醜。 有什麼辦法讓它更乾淨/整潔?

+0

你的問題有點文體和基於觀點。我認爲你的方法沒問題。是否有任何要求能夠揭示隱藏的數據?如果是這樣,你可能希望考慮加密你的輸出。如果不是這樣,我看起來很好 – ne1410s

+0

爲什麼不簡單地寫「真」,如果他們被證實,而「假」,如果他們不是?日誌是否需要包含其他非敏感數據? – Jedediah

+0

Hi @Jedediah,是的,我需要在每個請求中記錄其他非敏感數據,不管這個請求是好還是壞。 – user3174976

回答

4

我在這裏看到的主要問題可能是可維護性。當您將字段添加到CreditCard時,您必須在SantitzePaymentData()中添加額外的支票。如果其他開發人員後來着手這方面的工作,他們可能不知道這一要求,或者您可能在後來忘記,敏感信息將開始顯示在您的日誌中。由於這不會產生異常或編譯錯誤,因此可能需要一段時間才能注意到發生了這種情況。

我不知道這是一個真正的項目,還是隻是您用來學習的東西,但是當您決定添加其他付款方式(如電匯)時會出現另一個問題。然後,您將不得不創建另一個SanitizePaymentData()函數,該函數適用於新的付款類,但它基本上具有來自原始方法的重複代碼。這會重複工作,違反DRY主體,並在您的項目中造成混亂。

在我看來,更簡潔的方法是使用班級中的屬性,將敏感字段標記爲需要進行消毒,然後讓您的記錄器進行適當的響應。現在

public class CreditCard 
{ 
    [SanitizeInLog] 
    public string Brand {get; set;} 

    [SanitizeInLog] 
    public string BillingPhone {get; set;} 
} 

,你的測井方法/類可以簡單地檢查,看看是否在現場存在的屬性,並切換出來一個「*」或任何其他。

+3

一個有用的解決方案,如果要消毒的數據量是有限的。您可能需要添加要在日誌中使用的替換值作爲屬性的可選參數,如果沒有給定值,則默認值爲「*」。 – Alex

+0

@Alex yes,good call – Jedediah