为了记录事务,我需要告诉用户是否提供了必要的字段/信息。
如果是,我将实际信息替换为*。
如果否,我将使此请求失败,并返回“ 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”方法看起来很难看。
有什么方法可以使其更干净/整洁?
最佳答案
我在这里看到的主要问题可能是可维护性之一。将字段添加到CreditCard
时,必须在SantitzePaymentData()
中添加其他检查。如果其他开发人员以后进行此工作,则他们可能不知道该要求,或者您以后可能会忘记,敏感信息将开始显示在您的日志中。由于这不会产生异常或编译错误,因此可能需要一段时间才能注意到这种情况。
我不知道这是一个真实的项目,还是只是您要学习的东西,但是当您决定添加其他付款方式(例如电汇)时,就会出现另一个问题。然后,您将不得不创建另一个在新的付款类上运行的SanitizePaymentData()
函数,但该函数本质上将与原始方法中的代码重复。这会重复工作,违反DRY主体,并在您的项目中造成混乱。
我认为,一种更干净的方法是在您的类中使用将敏感字段标记为需要清理的属性,然后让记录器做出适当响应。
public class CreditCard
{
[SanitizeInLog]
public string Brand {get; set;}
[SanitizeInLog]
public string BillingPhone {get; set;}
}
现在,您的日志记录方法/类可以简单地检查以查看字段中是否存在那些属性,并将其切换为“ *”或其他。
关于c# - 如何在C#中清理/隐藏敏感数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29783862/