2010-11-16 40 views
0

這可能有點模糊,但我希望在所有的人中,會有一些人遇到過這種類型的問題。安全至關重要的應用程序 - 數據庫行驗證

背景
我們的應用程序是一個控制列車訂單的C#/ .NET服務。我們使用LINQ-to-SQL來存儲鐵路網絡的狀態,並在SQL Server 2005數據庫中訓練訂單。
我們有一個安全要求,即COTS軟件本身不能被「信任」。

要求
這樣的風險已經被捕獲爲:「SQL服務器或操作系統修改靜態或動態數據」
我們的要求:「存儲在數據庫中的數據應經過驗證,以便讀取後可以通過數據訪問代碼確認自上次提交以來它沒有發生變化。」

問題
我很想找到滿足該要求的「AUTOMAGIC」的方式。
失敗了,一種滿足條件的方法,而不必在數據庫的每個表中創建列來存儲計算出的散列(然後我們必須在讀取時驗證它們)。

+0

當然,任何滿足這一要求的「自動化」方式都將由COTS軟件來實現,從而產生一個悖論? – 2010-11-16 08:07:24

回答

1

也許類似於MD5 Checksum保存在與主數據相同或不同的表中。校驗和將由C#應用程序生成,因此如果任何人使用原始SQL進行更新,校驗和將會關閉。在閱讀

1

可以通過自上次提交它沒有 改變 數據訪問代碼進行確認。

這是微不足道的。在除快照之外的所有非髒讀取隔離級別下,所讀取的數據是最後提交的數據。根據定義,自從上次提交以來它沒有改變(換句話說,如果它已經改變,那麼新的值是最後一次提交的)。意外更改(因爲要求提及'操作系統修改數據')稱爲「數據損壞」,並由page checksumTDE捕獲。

也許真正的要求是,自從讀入應用程序後,數據庫中的值沒有改變?然後Optmistic Concurency Control,這就是它。只需將每個「舊」值添加到UPDATE WHERE子句中,它就會自行處理。如果你沒有更新任何行(你會通過檢查@@ ROWCOUNT或使用OUTPUT子句來知道),那麼你知道該行已經改變。 Proactive caching也可以部署。