如何在C#中清理/隐藏敏感数据

时间:2015-04-21 21:54:57

标签: c#

对于记录事务的目的,我需要告诉用户是否提供必要的字段/信息。 如果是,我将用*替换真实信息。 如果不是,我会将此请求作为失败的请求,并返回" false"值。

以下是数据定义类和方法。

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"方法看起来很难看。    有没有办法让它更整洁干净?

1 个答案:

答案 0 :(得分:4)

我在这里看到的主要问题可能是可维护性。在向CreditCard添加字段时,您必须在SantitzePaymentData()中添加其他检查。如果其他开发人员稍后对此进行了处理,他们可能不会意识到这一要求,或者您可能会在以后忘记这一点,并且敏感信息将开始显示在您的日志中。由于这不会产生异常或编译错误,因此可能需要一段时间才能发现这种情况。

我不知道这是一个真实的项目,还是您正在学习的东西,但当您决定添加其他付款方式(如电汇)时会出现另一个问题。然后,您必须创建另一个适用于新付款类的SanitizePaymentData()函数,但它将基本上与原始方法中的代码重复。这种重复工作违反了DRY原则,并在您的项目中造成混乱。

在我看来,更清洁的方法是在类中使用将敏感字段标记为需要清理的属性,然后让记录器做出适当的响应。

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

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

现在,您的日志记录方法/类可以简单地检查字段上是否存在这些属性,并将其切换为“*”或其他任何内容。