2013-08-25 89 views
0

隱藏域篡改保護:Id,RowVersion,我使用亞當Tuloman AntiModelInjection版本。解決方案:選擇輸入,防止下拉篡改

我目前正在調查一種方法來防止篡改在選擇列表/下拉菜單中找到的有效選項。考慮一個多租戶共享數據庫解決方案,其中fk不夠安全,並且選項在級聯下拉列表中被動態過濾。

在ASP.NET webforms的舊時代,有一種viewstate可以免費添加防篡改功能。如何在阿賈克斯時代完成選擇列表篡改防範?通過比較散列而不是重新從數據庫中獲取選項值並手動比較,是否有一個通用的解決方案?

Is ViewState relevant in ASP.NET MVC?

回答

0

勒布朗,以我的經驗,客戶端驗證已大多用於用戶提供方便。不必POST,只有然後發現有什麼不對。

最終驗證需要發生在服務器端,遠離操縱HTML的能力。普通用戶不會忍受選擇列表和下拉菜單的磨練。這是由試圖破壞你的頁面或非法訪問數據的人完成的。我想我的觀點是最終安全需要存在於服務器中,而不是客戶端。

0

我認爲在給出一些假設的情況下可以創建一個全局解決方案。在我建立任何東西之前,我想提出一個開放的解決方案,以查看是否有人可以發現缺陷或潛在的問題。

鑑於所有下拉列表都遠程檢索其數據。 - 在ajax時代和級聯盒現在更常見。 (我們使用的劍道下拉列表。)

public SelectList GetLocations(int dependantarg); 

選擇列表的將被返回的JSON - 但沒有newtonsoft序列化器自動注入之前(在全球範圍內完成)

  1. EncryptedAndSigned屬性設置JSON。該屬性將包含完整SelectList的序列化版本,其中包含所有也被加密的有效值。
  2. EncryptedName屬性給json。此屬性將有控制器actionname - 在這個例子中EncryptedName值將是「的getLocations」

當HTTP POST由EncryptedName:EncryptedAndSigned必須在後也可以發送。對於這個JSON POST例子那就是:

{ 
Location_Id: 4, 
GetLocations: 'EncryptedAndSigned value' 
} 

在服務器端:

[ValidateOptionInjection("GetLocations","Location_Id") 
public ActionResult Update(Case case) 
{ 
    //access case.Location_Id safety knowing that this was a valid option available to the user. 
} 
1

如果可以的話,這裏的單一解決方案是由當前用戶ID的權限來過濾該數據,並那麼這些權限會在保存時再次驗證。

如果這是不可能的(並且服務器端通過諸如記錄中的CustomerId fk之類的東西來完成此操作有多種方式,要添加到服務器端的臨時安全緩存等),則客戶端價值可以提供額外的選擇。

如果客戶端選項與Web窗體一樣提供,請考慮根據其 a進行加密。)用戶ID和另一鍵 灣)的SessionID(必須建立會話時間提前雖然或者直到會話是由存儲在所述會話的值來建立會話ID可以爲每個請求改變對象。 ℃。)一些其它不同值

HTTPS是極其重要這裏,所以這些值不聞。此外,理想情況下,您希望每頁都具有唯一性。這可能是上面A中的第二個關鍵。爲什麼?我們不希望攻擊者想出一個辦法,在你的web應用創建別處新記錄,並能夠找出哈希值或加密值是1,2,3,4,5,6等,並創建本質上是一個價值假彩虹表。

+0

所以,如果ValidateOptionInjection加密密鑰列入ActionName,USER_ID,TenantDataGroup_Id,程序集的版本,部署鹽?單獨使用密鑰會使每個下拉式加密都以每個用戶爲基礎單獨使用。這種廣義解決方案的好處是可以用相對小的努力來保護應用程序。額外的服務器驗證器可以始終添加,但從一開始,這將保護大多數下拉列表並阻止更多的個人篡改表單。 –

+0

會,不過,請注意,如果你重構與上述任何數據的改變你的數據會失敗。因此,如果用戶正在編輯一個頁面,而你部署一個新的版本,後返回到服務器,然後將失敗。我不確定你的應用程序是否允許這樣的事情,但要牢記這一點。 Web表單跟蹤所有值,當您想通過客戶端腳本動態地將值添加到下拉列表中時,它變得困難。 –