2014-02-06 12 views
1

我想使用OriginalValuesMap對保存進行一些自定義審計。在breeze文檔中,他們提到您可能需要添加額外的安全性(它來自客戶端,所以不要相信它)。Breeze:如何使原始值映射更安全

我的目標是找到一種方法來驗證原始值映射未被篡改,以便我的審計條目準確無誤。 (我想擊敗的一個漏洞利用的例子是有人在原始值映射中改變了一個值,使它看起來好像沒有改變值)。

我在想這樣做這樣的事情:

  1. 當數據從服務器查詢,應用散列到實體
  2. 的值包括在實體的串行圖哈希(所以散列值是發送給客戶端的一個不透明的值,但散列的鹽值只是服務器所知的一個祕密)。
  3. 當客戶端調用保存更改時,將散列回顯給服務器
  4. 在對話實例內部,使用來自OriginalValuesMap的值重建原始實體。
  5. 這個「de-deltaed」實體的哈希值應該與原始值匹配。

我唯一的問題是,我不知道如何將散列插入微風的序列化圖並將其提取出來。

它看起來像有幾個有前途的擴展點(客戶端上的自定義序列化器,自定義內容提供者)。

如何做到這一點? 有沒有更好的方法? 我是否堅果?

回答

3

你是瘋了。

但嚴重的是,最直接的方法是重新查詢數據庫中的現有數據 以查看originalValuesMap與db中的內容匹配。如果他們沒有, originalValuesMap已被篡改,或db數據已被更新(由其他人) ,因爲它被查詢。在任何情況下都應該中止保存。

當你在這,你可能會想執行服務器上的一些其他規則:

  • 一些實體是非法的保存(如不允許用戶以新的國家加入到查找表)
  • 一些實體只能由用戶在一定的作用被保存(如管理員)
  • 一些實體只能由用戶保存的「擁有」它們(例如,用戶只能更新屬於它們的順序)
  • 這些值是經過健全檢查的(例如價格是正確的數量是合理的)
  • 該操作經過健全性檢查(例如,用戶無法在一小時內創建超過1000個訂單)
  • 其他業務規則適用(例如,信用額度,時間限制等。)

顯然其中的一些並不適用於您的應用程序,但你會發現,有一些規則 需要反正查詢數據庫。所以這就是你應該如何驗證你的originalValuesMap

如果您打算使用「散列」技術,將數據來回傳遞給客戶端的最簡單方法是在未映射到數據庫的域模型基類中爲其添加屬性。序列化之前,您將填充服務器上的屬性。