2011-08-30 56 views
0

,我检索一些敏感数据并将其显示在我的页面上。
我的目标是尽快将这些数据从堆中取出。我知道将dataset变量设置为nothing/null仍然会将数据留在堆中。我发现对于自定义对象,我必须手动清零内容,对于DataSet,我可以调用DataSet.Clear()使用ASP.NET和SQL Server 2005从内存中删除数据

这些是最好的方法吗?

这种情况怎么样:
DAL调用SQL,填充数据集,并将数据集(或指向堆中数据集的指针)返回给BLL。然后BLL将该数据集(即指针)返回给UI。 UI将网格的数据源设置为该数据集。何时以及如何清除该数据集?

在Page_Unload中,我是否创建一个新的数据集变量,将网格的数据源设置为它并调用.Clear()?

我的要求并不是真的要在任何时候加密数据,而是在不需要时立即清除数据,无需等待GC或手动呼叫Collect()

+0

我很困惑。只有html,css,javascript(以及是viewstate)被发送到浏览器。堆在服务器上,垃圾收集在服务器上。 –

+0

是的,堆在服务器上,这是服务器端的问题。 – user12345

回答

0

您需要确保从内存中立即删除数据?由于没有完美的方式来做到这一点。如果攻击者具有物理访问权限,则cold boot attack会使服务器同样易受攻击。

您发送给浏览器的所有内容都不能被删除(浏览器可以缓存,用户可以将其保存到硬盘等)。否则,如果它在服务器上的RAM上,那么删除发生时应该不是那么重要。

更大的问题是为什么首先存在敏感数据。尤其是如果它没有发送到浏览器...

0

值类型,如intchar可以通过为其分配新值来清除。

字符串不能以这种方式清除。如果你为一个字符串变量赋值一个新的值,它只会替换引用并且保留堆中旧的字符串对象被收集。

DataSet上调用Clear不会清除堆中的任何数据,它只会为垃圾回收器留下所有内容。即使您循环访问数据集中的每个DataTable中的每个DataRow,并为每个字段分配一个新值,它仍然会将所有值留在堆上。由于值存储为object,因此每种值类型都是装箱的,因此您无法通过为其分配新值来擦除值,只会将堆积值留在堆上并创建新的装箱值。