覆盖然后设置为null

tga*_*ews 6 c# sql-server asp.net e-commerce pci-compliance

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

cardnumber = "11111111111111111111";
cardnumber = null;
Run Code Online (Sandbox Code Playgroud)

或者在sql中

update cards set cardnumber = '11111111111111111111' where customerid = @CustomerID
update cards set cardnumber = null where customerid = @CustomerID
Run Code Online (Sandbox Code Playgroud)

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

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

Cyr*_*don 4

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

当你写的时候

cardnumber = "11111111111111111111";
Run Code Online (Sandbox Code Playgroud)

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

当你写的时候

cardnumber = null;
Run Code Online (Sandbox Code Playgroud)

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

看看MSDN上George Duckett分享的SecureString页面在评论中是怎么说的:

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

进一步阅读: