2012-08-02 66 views
1

我已經瀏覽了很多線程和/或在互聯網上尋找明確答案的問題,但到目前爲止還沒有得到任何答案。我們應該在哪個網站上進行數據驗證?

問題的一部分已經回答了(除非你告訴我這是錯誤的)。數據驗證應該在客戶端和服務器端完成。客戶端通知用戶無效的數據,並卸載服務器以及服務器以防止任何形式的攻擊。

驗證雙方可能是一個乏味的任務,但我想知道是否有辦法做到這一點,以便你沒有太多重複的代碼。

還有一些我想知道的...我有一個包含該行的id(數據庫)的行的表。在每一行的末尾,我有一個刪除按鈕,可以從html中刪除它,我的JSON對象包含我的值數組,並且發送給要從數據庫中刪除的ajax調用(2個表之間的鏈接)。

這是不安全的(以及像互聯網這樣的不安全的環境),我知道它。我總是可以檢查客戶端,看看id是否只有數字,如果是,然後檢查服務器端是否存在。但是誰告訴我用戶沒有進入調試器並倒置2行,最終刪除不應該是的行?有什麼是最好的方式來讓我的ID變得安全,並讓他們安然無恙?

任何建議表示讚賞

+1

您應該**總是**驗證服務器端的數據。如果你不想做它的客戶端,那麼你可以編碼你的服務器端驗證返回錯誤消息給用戶,而不是執行操作,雖然不是一個PHP開發人員,我不知道有多容易將實施。 – 2012-08-02 14:30:06

回答

3

數據驗證應完成客戶端和服務器端。

它不是真的需要做它的客戶端恕我直言。但在提交數據之前能夠通知用戶是很好的。所以我會把它稱爲pre。

驗證雙方可能是一個乏味的任務,但我想知道是否有辦法做到這一點,以便你沒有太多重複的代碼。

因爲PHP是服務器端,javscript是客戶端,所以防止重複代碼並不容易。有一種方法我知道使用xhr requests。這樣你就可以在javascript(clientside)中使用php驗證。

在每一行結束時,我有一個刪除按鈕,從HTML

請告訴我你正在使用CSRF protection刪除。:-)

我總是可以檢查客戶端,看看id是否只有數字,如果是的話,然後檢查服務器端是否存在。

爲了防止惡意sql注入你應該use prepared statements and parameterized queries

+0

我認爲最好在雙方都這樣做。你總是可以做更簡單的驗證客戶端。 – 2012-08-02 14:36:50

+0

「請告訴我你正在使用CSRF保護。:-)」我會仔細研究這一點。我幾乎到處都在使用prep語句。我只使用POST,通常使用strip_tags並修剪輸入的數據。但是我想知道的是,如果數據是有效的,但只有與另一個有效值相反,它可能會搞砸數據庫值或類似的東西。有沒有辦法阻止這種情況? – Rayfloyd 2012-08-02 14:45:57

+0

@Rayfloyd「如果數據是有效的,但只有與另一個有效值相反,它可以搞砸數據庫值或類似的東西」你可以實現[ACL](http://en.wikipedia.org/wiki/Access_control_list)那。 – PeeHaa 2012-08-02 14:54:43

2

驗證應總是在服務器完成。客戶端驗證僅供用戶使用,並且從安全角度來看並非嚴格必要(除非它打開了XSS安全漏洞)。

除此之外,您應該清理您從用戶處收到的每個輸入。輸入通過完整性檢查後(例如,如果文本中應該有一個數字),您應該執行權限測試(用戶是否具有執行所請求操作的適當權限?

完成此操作後,您可以真正執行該事務。

0

由於已經發布了其他答案,我建議您專用一個實用程序類,您可以調用實用程序,並在其中存儲許多有用的函數以檢查服務器端的數據類型&內容,即使您將會在客戶端和服務器端進行一些很好的驗證,至少你的代碼會更易讀和易於管理。

創建和管理自己的工具類的另一個好處是,您可以在所有項目中輕鬆使用它們。

例如,實用程序類可以包含從驗證某個字段是否在特定值範圍內或者它不包含特殊字符(使用正則表達式)等等的方法...您的高級實用程序方法將重點放在防止腳本插入,如前所述的SQL注入。總而言之,你會做一次工作並從中受益,我相信你不想開始檢查年齡字段是負面的,還是從頭開始做每個項目的任何事情。使用Ajax和XHR可以成爲您的服務器端和客戶端代碼之間的橋樑,並有助於您統一驗證並避免重複。

相關問題