【问题标题】:Overwrite then set to null覆盖然后设置为空
【发布时间】:2013-04-19 09:56:16
【问题描述】:

我正在开发一个旧版电子商务平台,并且在处理信用卡号时注意到了一个惯例。 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. 是否还需要 今天进行了吗?

【问题讨论】:

  • 仅供参考 SecureString 类现在存在。可能会感兴趣。
  • 那张表上有触发器吗?
  • @Steve 桌上没有触发器。
  • @tgandrews 那肯定是巫毒编程。字节仍将保留在内存中的某个位置,直到它们被覆盖(大概只有当 GC 运行 并且 该内存块被重用,而不是仅仅被放置在空闲内存列表中)。 George 提到的 SecureString 当然是正确的解决方案(至少在 .Net 中)。
  • 我的印象是,简单地用01 覆盖数据并不意味着数据将变得不可恢复,并且一些偏执的人更愿意通过覆盖来删除他们的数据多次随机序列。也许这就是它的全部意义?

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


【解决方案1】:

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

当你写作时

cardnumber = "11111111111111111111";

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

当你写作时

cardnumber = null;

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

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

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

进一步阅读:

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2020-01-22
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多