2013-04-23 75 views
4

我有一個表單用戶填寫並使用JavaScript來驗證輸入(例如確保密碼字段不留空白)。由於JavaScript是客戶端,沒有編譯,任何人都可以輕鬆搞定它。這是否意味着需要在服務器上再次驗證來自用戶的數據?如果是的話,是否有反正它可以提高效率,因爲JavaScript(理論上)已經做到了?驗證服務器是否必須始終檢查憑據時,驗證JavaScript驗證的重點是什麼?

+1

可能重複的[你應該在服務器端進行驗證嗎?](http://stackoverflow.com/questions/1125772/should-you-do-validation-on-the-server-side) – Thilo 2013-04-23 00:10:36

回答

6

是的,有必要驗證服務器上的數據,因爲它可能會被最終用戶客戶端搞砸。

如果是的話,是否有反正它可以更有效,因爲JavaScript(理論上)已經做到了?

它已經比僅進行服務器端驗證更有效率,因爲通過進行客戶端驗證可避免大量往返驗證(您只需提交一次數據,除非驗證是不完整或殘疾,它會直接通過)。也提供更好的用戶體驗。

你不能廢除服務器端驗證(如果你關心數據)。如果數據只回溯到同一個用戶,並且沒有在其他地方顯示或使用(並且沒有可能破壞系統中的任何內容),那麼您可以放鬆一點。作爲一個極端的例子,Dropbox可能不關心你上傳的文件,所以他們不驗證你上傳的HTML是否包含惡意的Javascript。

1

是的。在重新發布到服務器之前,某人仍然可能會攔截表單並修改值。

+1

或者,他可以簡單地運行'telnet'或'curl'。 – 2013-04-23 00:30:08

+0

+1捲毛。另外,我相信,提琴手。 – 5arx 2013-04-23 10:12:15

+0

黑客會想要自動化他的攻擊。命令行工具將是最好的。 – 2013-04-23 10:33:34

2

只需點擊一下鼠標,我就可以禁用網頁上的任何JavaScript。我甚至可以完全繞過HTML表單並將數據直接發送到您的服務器。

例如,如果您通過$_GET檢索數據,我可以繞過您的表單(以及javascript驗證),只需通過地址欄的操作即可。不要認爲使用$_POST會改變這一點:它只是編寫HTTP請求的問題。

所以,絕對不要信任用戶輸入,即使使用javascript進行消毒。

正如有人張貼以上,JavaScript驗證可以防止合法用戶錯誤(從而節省行了錯誤的數據會做你的服務器,然後返回給用戶),但惡意的用戶仍然能夠繞過它非常容易。

1

該用戶當然可以禁用JavaScript。因爲源代碼就在那裏,所以它也很容易混淆。用戶也可以運行任意的JS,使得更容易混淆你的東西。

因此,您應該始終進行服務器端驗證。客戶端驗證應僅作爲用戶的方便信息使用。永遠不要相信它是你唯一的安全來源。

2

簡短回答:是且永遠!

閱讀關於PDO,SQL注入,UUID,令牌,MD5,SHA,跨站請求僞造......您有一個全新的世界去發現! :)我的意思是一個好方法。瞭解這一點,您將構建更安全的網站

您始終需要牢記:不要信任用戶輸入數據。決不。所以你必須在服務器端執行額外的驗證過程。

0

是的,爲了安全起見,您需要添加服務器端驗證。
在客戶端預計完成的任何事情都得到保證,因此您需要重複任何重要的事情。
此外,有些事情可能在服務器端進行評估,但不在客戶端。像SQL注入檢查等事情屬於這個類別。

+0

標記所有人的答案的輕微威懾力在於它讓你處於最底層。哈! – RacerNerd 2013-04-23 00:08:47

1

是的,你必須在客戶端和服務器端進行驗證。 你必須考慮漸進式增強。把Javascript看作只是一個增強層而不是必要的層。因爲它總是由用戶決定在瀏覽器中禁用Javascript,所以呈現你的Javascript代碼是無用的。

客戶端驗證中的一個優點是,您正在往服務器保存往返,驗證用戶名或密碼是否爲空,這很容易在javascript中完成。