ASP.NET MVC:數據註釋驗證是否足夠?
我在 ASP.NET MVC 2 中廣泛使用了數據註釋驗證。這個新功能節省了大量時間,因為我現在能夠在一個地方定義客戶端驗證和伺服器端驗證。然而,當我做一些詳細的測試時,我意識到如果我單獨依賴數據註釋驗證,那麼有人很容易繞過伺服器端驗證。例如,如果我通過使用 [Required] 屬性註釋屬性來定義一個必填欄位,並在表單中為該必填欄位放置一個文本框,使用者可以簡單地從 DOM 中刪除該文本框(這可以通過 Firebug 輕鬆完成)現在,在 Controller 內部的 ModelBinding 期間,不會在該屬性上觸發 Data Annotation 驗證。為確保觸發“必需”驗證,
大家對驗證有什麼建議?數據註釋驗證是否足夠?或者是否需要重複驗證以確保在所有情況下都會觸發驗證?
後續評論: 根據下面的答案,我似乎不能單獨依賴模型綁定器和數據註釋驗證。由於我們得出的結論是需要額外的伺服器端驗證,我的服務層是否有一種簡單的方法可以根據數據註釋中定義的內容觸發驗證?似乎這將使我們兩全其美……我們不需要重複驗證程式碼,但即使 Model Binder 沒有觸發驗證,我們仍將確保執行驗證。
我將把這個後續評論作為一個單獨的問題發布,因為它提出的問題與原來的問題不同。
我認為要對安全性保持警惕,您應該選擇將伺服器驗證作為優先事項,並確保這始終是您的備份方案。您的伺服器驗證應該在沒有客戶端驗證的情況下工作。客戶端驗證更多地用於 UX,儘管這對您的設計至關重要,但它僅次於安全性。考慮到這一點,您會發現自己在重複您的驗證。一個目標通常是嘗試設計您的應用程序,以便盡可能集成伺服器和客戶端驗證,以減少在伺服器和客戶端上進行驗證所需的工作。但請放心,您必須兩者都做。
如果繞過客戶端驗證(通過 DOM 操作)正在避免伺服器驗證(您似乎在指示),那麼您對該實例的伺服器驗證可能無法正確使用。您應該在控制器操作或服務層中再次呼叫伺服器驗證。您描述的場景不應該破壞您的伺服器驗證。
對於您描述的場景,DataAnnotation 屬性方法應該足夠了。您似乎只需要進行一些程式碼更改,以確保在送出表單時也呼叫您的伺服器驗證。