我正在开发一个传统的电子商务平台,并在处理信用卡号码时注意到了一个惯例。 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就不会完全删除数据只是说它可用。
答案 0 :(得分:4)
我不知道SQL,但在C#中,它没有意义。由于字符串是不可变的,因此即使您尽可能努力,也无法覆盖数据。
写作时
cardnumber = "11111111111111111111";
这只是在内存中创建另一个字符串,但旧的卡号仍在此处,位于内存中的某个位置。
当你写作
cardnumber = null;
取消引用先前创建的字符串,现在您有一个引用cardnumber
指向任何内容。但是包含真实卡号的字符串仍然在这里
所以这段代码不仅错误,而且很危险,因为它会给你一种虚假的安全感。
在评论中查看MSDN在SecureString分享的George Duckett页面上所说的内容:
System.String类的实例既是不可变的,也不是 需要更长时间,无法以编程方式安排垃圾 采集;也就是说,实例在创建后是只读的 无法预测何时将从中删除实例 电脑记忆。因此,如果String对象包含敏感 密码,信用卡号或个人数据等信息, 信息在使用后可能会被泄露 因为您的应用程序无法从计算机内存中删除数据。
进一步阅读: