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不会完全删除数据只是说它可用.
我不知道 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 对象包含密码、信用卡号或个人数据等敏感信息,则这些信息在使用后可能会存在泄露的风险,因为您的应用程序无法从计算机内存中删除这些数据。
进一步阅读:
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |