7

使用驗證器同時使用客戶端驗證(JavaScript)和服務器端驗證的參數是:如果客戶端瀏覽器不支持JavaScript,則用戶不能使用客戶端驗證。

我的問題是這個論點在實踐中有多好?從理論上講它是有道理的,但實際上,如果JavaScript在瀏覽器中被禁用,那麼大多數網站功能甚至都不起作用。如果沒有JavaScript,用戶可能甚至無法加載頁面,更不用說提交表單了。爲什麼我們需要客戶端和服務器端驗證?

+1

這可能更適合[程序員](http://programmers.stackexchange.com/)。投票遷移。也有潛在的重複:http://stackoverflow.com/questions/3483514/why-is-client-side-validation-not-enough?rq=1 – 2013-04-06 20:38:54

+0

實質上,沒有客戶端驗證,如果它是這樣的事情被視爲安全問題。沒有關閉JavaScript的瀏覽器可能會殺死互聯網上所有網站的95%。幾乎沒有網站似乎有非JavaScript瀏覽的後備。 – 2013-04-06 20:41:09

+1

@Allendar:大網站呢。你會驚訝地發現Facebook(好吧,大部分的臉書,有些不是)沒有JS。這是中檔和「omg web2.0真棒」的網站,不...這是一個恥辱,無論是對他們還是其他人。然而,有些人卻永遠不會學到:-( – 2013-04-06 21:18:49

回答

29

客戶端驗證只是避免客戶端「但我填補了這一切,它並沒有告訴我任何東西!」。它不是,實際上是強制性的,實際上,客戶端驗證是一個非常新的事物(閱讀:5歲或更少)。實際上,它所做的只是阻止你的客戶端(啓用JS)在重新加載頁面之前知道表單是否正常。 如果AJAX在遊戲中,它不同 - 它允許您節省帶寬,並在提交之前向用戶提供反饋。 最後,如果您正在建立嚴格的客戶端,對等交換應用程序(思考遊戲),您需要客戶端驗證以防止客戶端作弊。

服務器端驗證也很關鍵,因爲客戶端驗證可以通過關閉JavaScript來完全繞過。從某種意義上說,JS驅動的驗證是一種方便和美觀/美觀的改進,應該依賴於而不是。此外,爲了禁用或繞過最複雜的JS驗證,在本地編輯頁面源代碼是微不足道的。

如果你不服務器端驗證,用戶可以做什麼?任何事情,取決於你如何使用他們的數據。你可能會允許用戶刪除整個數據庫(或更糟的是,泄漏它們),修改他們喜歡的任何東西(或者更糟糕的是,讀取他們喜歡的任何東西。目錄遍歷漏洞是淘氣人員非常常見的入口點),並隨意提升他們的權限。你想冒這個風險嗎?不驗證用戶輸入就像信任別人,而不是在你的房子上安裝鎖。

7

驗證應該始終在服務器端執行 - 您永遠不能相信客戶端驗證。

客戶端驗證總是提供更好的用戶體驗(UX),因此用戶不必僅僅因爲表單中的值無效就提交併重新加載頁面 - 它使事情更具活力。因爲你甚至不需要瀏覽器發出請求,獨立於依賴JS正常工作的你的網站,你將需要服務器端的驗證和消毒所有的用戶輸入,以防你不關心你的數據庫沒有被執行。

現在由您決定是否要提供具有動態客戶端驗證提示的UI。

+1

@ Kassik嗯,我通常使用[TamperData](https://addons.mozilla.org/en-us/firefox/addon/tamper-data/)當我測試我的頁面對SQL注入,我還使用Node.js([form-data module](https://github.com/felixge/node-form-data))從頭開始生成請求。實際上,任何程序都可以發出http請求併發送任意的GET/POST數據 - 我不太確定它是如何適用於java後端的,但它不應該太差。 – 2013-04-06 20:52:23

+0

驗證_can_可以在客戶端上完成,例如許多瀏覽器都支持HTML5表單驗證屬性 - http://www.html5rocks.com/en/tutorials/forms/constraintvalidation/ – andyb 2013-04-06 21:00:14

+0

@andyb「驗證」在這個意義上僅僅是UX。通過Chrome開發工具/ Firebug禁用這些限制,可以輕鬆繞過這些限制,畢竟這些都不過是可以通過JavaScript訪問和修改的DOM元素屬性。 – 2013-04-06 21:01:50

0

客戶端驗證是高度交互式表單的動態字段驗證解決方案,但它不會阻止惡意用戶向服務器注入和發​​布無效格式數據。重要的是你的服務器端腳本驗證用戶正在做的所有事情,否則你會暴露你的網站到SQL注入攻擊,XSS攻擊,用戶做他們不應該等的東西等。

2

始終保護您的輸入服務器。這並不總是關於JavaScript禁用的用戶,而且他們也可能會破壞服務器。例如,如果一個站點對<input>進行JavaScript最大長度檢查,用戶可以禁用該檢查,從而發送比您的服務器和/或數據庫預期更多的數據。這可能會導致長時間佔用服務器線程的大型POST重載服務器,這可能會暴露數據庫中的弱點,例如違反數據庫約束,可能會暴露有關任何持久性信息的詳細信息。更糟的是,如果沒有限制,用戶可能能夠執行注入攻擊。

另一個例子是有人使用外部HTTP工具向您的服務器發送請求,完全繞過任何JavaScript。我一直在開發Chrome用Advanced REST Client來測試JSON API。

通過JavaScript進行客戶端驗證只是向使用該站點的人提供有關其與站點交互的任何信息的反饋更快的方式。在傳統的客戶端 - 服務器通信中,應該是而不是是上述原因的唯一驗證。

1

如果用戶已經禁用了javascript,那麼他自己就有問題了,他決定單獨禁用javascript,理由是......爲此,當您創建網站時,您必須始終牢記您的網站必須是有效的適用於帶有和不帶javascript的用戶。需要用於多種原因兩側驗證,它們中的一些是:

  • 用戶停用了JavaScript
  • 在目的的惡用戶爲了利用系統
  • 用JavaScript已經移除了JavaScript的驗證您減少網站和客戶之間的數據流量。
  • 當然與服務器驗證您確保一次爲所有的數據是正確的

有可能有一個使用JavaScript和「老」技術是有效的爲每一位用戶一個網站,每個瀏覽器。

相關問題