使用ASP.NET和SQL Server 2005,我检索一些敏感数据并将其显示在我的页面上
我的目标是尽快将这些数据从堆中取出。我知道将数据集变量设置为nothing / null仍然会将数据保留在堆中。我发现对于自定义对象,我必须手动清零内容,对于DataSet我可以调用DataSet.Clear()
。
这些是最好的方法吗?
这种情况怎么样:
DAL调用SQL,填充数据集,并将数据集(或指向堆中数据集的指针)返回给BLL。然后BLL将该数据集(即指针)返回到UI。 UI将网格的DataSource设置为该数据集。何时以及如何清除该数据集?
在Page_Unload中,我是否要创建一个新的数据集变量,将网格的DataSource设置为它并调用.Clear()?
我的要求并非总是在任何时候对数据进行加密,而是在不需要时立即将其清除,无需等待GC或必须手动调用Collect()
。
答案 0 :(得分:0)
您需要确保立即从内存中删除数据?因为没有完美的方法来做到这一点。如果攻击者具有物理访问权限,cold boot attack会使服务器同样容易受到攻击。
您使用ASP.NET页面发送到浏览器的任何内容都无法删除(浏览器可以缓存它,用户可以将其保存到硬盘驱动器等)。否则,如果在发生删除时它位于服务器上的RAM中,则不应该太担心。
更大的问题是为什么这些敏感数据首先出现在那里。特别是如果它没有发送到浏览器......
答案 1 :(得分:0)
可以通过为其分配新值来清除值int
和char
等值类型。
字符串不能以这种方式清除。如果为字符串变量分配新值,它将只替换引用并将旧字符串对象保留在要收集的堆上。
在Clear
上调用DataSet
不会清除堆中的任何数据,它只会留下垃圾收集器的所有内容。即使您遍历数据集中每个DataRow
中的每个DataTable
并为每个字段分配一个新值,它仍然只会将所有值保留在堆上。由于值存储为object
,因此每个值类型都是装箱的,因此您无法通过为其分配新值来擦除该值,它只会将装箱值保留在堆上并创建新的装箱值