2017-01-12 39 views

回答

1

對客戶端發生的事情絕對不信任。您收到的所有值都可以直接發送,或者通過支持它的任何工具(如Postman,Fiddler等)進行擴充。它並不需要太深入的知識,所以您應該期望任何人都能夠做到這一點。

這意味着您不僅應該驗證您收到的數據的方式至少與您在客戶端上執行的方式相同,還應該確保執行操作的用戶有權訪問這些數據。例如。如果您收到更新Id = 6的某個對象的請求,則應始終驗證該用戶是否有權執行該操作(例如,該對象屬於該用戶等)。如果沒有這個,就很容易「破解」你的網站(只需要修改Id = 7執行相同的請求)

這並不意味着你不應該在客戶端進行驗證。但客戶驗證的原因是不同的。它通過即時反饋(無回傳)提供更好的用戶體驗,而不是信任來自客戶端的任何內容。

關於你的問題的答案:這取決於。很有可能不涉及安全風險。例如。如果您的驗證檢查該電子郵件是有效的,則可以繞過該電子郵件,但唯一可能的風險是您無法發送郵件,例如等等。如果您檢查該電話不是空的,那麼您可能會冒這個風險將會是空的或者無法插入數據庫中。

在這種情況下,您可能決定不打擾,因爲您的應用程序的有效使用不允許這樣做,並且它不會成爲用戶發佈錯誤數據的安全風險。因此,像往常一樣,您應該決定是否值得花時間實施服務器驗證。請記住,這並不意味着您可以跳過上述重要的事情,即驗證用戶是否有權訪問等。

在任何情況下,與客戶端具有相同的服務器端驗證是有益的,但如果值得的話,是另一個問題。

+0

謝謝伊利亞的全面回答。這非常有幫助。從安全的角度來看,你是對的。 Joe Audette提到的情況也是可能發生的另一個問題。比你們。 – user1331586

+0

歡迎:) –

2

是,總是需要服務器端驗證,因爲客戶端驗證可以通過禁用JavaScript的

+0

這並不像你在這裏寫的那樣直截了當,因爲沒有服務器端驗證(對應於客戶端驗證電話,電子郵件等)可能根本沒有安全問題。下面我寫了一個更全面的答案。所以,即使客戶端驗證不能被繞過,也不一定是安全問題。 –

+0

我絕對不希望在代碼兩端都做每一個驗證。有些事情你不需要它。 –

+0

如果您以聲明方式使用帶有數據註釋的模型,則可以非常容易地執行這兩種操作,這就是您輕鬆連接客戶端驗證的方式,同樣的事情允許您只需在控制器操作中檢查ModelState.IsValid。 –

0

決不信任用戶,並通過服務器端總是有效的被繞過。例如,通過發送無效數據(可能是攻擊向量),請求可能會很容易被欺騙。

相關問題