覆盖然后设置为null

时间:2013-04-19 09:56:16

标签: c# asp.net sql-server e-commerce pci-compliance

我正在开发一个传统的电子商务平台,并在处理信用卡号码时注意到了一个惯例。 C#

cardnumber = "11111111111111111111";
cardnumber = null;

或在sql中

update cards set cardnumber = '11111111111111111111' where customerid = @CustomerID
update cards set cardnumber = null where customerid = @CustomerID

我认为推理是在将其设置为null之前将其从内存中删除,这可能不会删除该值。但是这种推理似乎表明SQL Server和/或.NET VM存在漏洞,只要将其设置为null就不会完全删除数据只是说它可用。

  1. 我对它的理解是否正确?
  2. 是否还需要 今天进行了吗?

1 个答案:

答案 0 :(得分:4)

我不知道SQL,但在C#中,它没有意义。由于字符串是不可变的,因此即使您尽可能努力,也无法覆盖数据。

写作时

cardnumber = "11111111111111111111";

这只是在内存中创建另一个字符串,但旧的卡号仍在此处,位于内存中的某个位置。

当你写作

cardnumber = null;

取消引用先前创建的字符串,现在您有一个引用cardnumber指向任何内容。但是包含真实卡号的字符串仍然在这里 所以这段代码不仅错误,而且很危险,因为它会给你一种虚假的安全感。

在评论中查看MSDN在SecureString分享的George Duckett页面上所说的内容:

  

System.String类的实例既是不可变的,也不是   需要更长时间,无法以编程方式安排垃圾   采集;也就是说,实例在创建后是只读的   无法预测何时将从中删除实例   电脑记忆。因此,如果String对象包含敏感   密码,信用卡号或个人数据等信息,   信息在使用后可能会被泄露   因为您的应用程序无法从计算机内存中删除数据。

进一步阅读: