2011-08-30 59 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,因此每種值類型都是裝箱的,因此您無法通過爲其分配新值來擦除值,只會將堆積值留在堆上並創建新的裝箱值。