6

我在一个传统的电子商务平台上工作,并且在处理信用卡号码时注意到了一个惯例。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. 今天还需要执行吗?
4

1 回答 1

4

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

当你写

cardnumber = "11111111111111111111";

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

当你写

cardnumber = null;

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

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

System.String 类的实例是不可变的,并且在不再需要时,不能以编程方式安排垃圾回收;也就是说,实例在创建后是只读的,无法预测实例何时会从计算机内存中删除。因此,如果 String 对象包含密码、信用卡号或个人数据等敏感信息,则存在使用该信息后可能会泄露的风险,因为您的应用程序无法从计算机内存中删除数据。

进一步阅读:

于 2013-04-19T10:05:04.670 回答