2012-12-25 20 views
-1

每一個我覺得這個「永遠(永遠)相信外國投入」的地方。他們要求驗證每個用戶的輸入。但我不確定我應該驗證什麼。如果用戶輸入任何惡意代碼,是否有任何標準來驗證用戶輸入?其實我想知道這個惡意代碼可能是什麼以及如何驗證?是否有任何標準來驗證用戶在php中的輸入?

經過一番研究,我發現了一個用於密碼驗證的標準password.php,用於電子郵件驗證的FILTER_VALIDATE_EMAIL以及用於驗證URL的FILTER_VALIDATE_URL。但對於像名稱,textarea,電話號碼,用戶名等其他輸入形式是否有任何標準來驗證?

+2

我認爲輸入是否無效取決於_you_期望的結果以及_you_計劃如何使用它。 – Passerby

+0

那麼,不信任用戶輸入的一個原因:http://xkcd.com/327/ –

+0

好吧,我期待它晚點來。但我必須確保首先該用戶沒有輸入任何惡意輸入來攻擊我的網站。然後我會根據需要進行其他驗證。 – asdfkjasdfjk

回答

3

你應該驗證根據您的業務規則輸入(電子郵件驗證是這種情況)。 你應該逃脫輸出基於輸出媒體上 - 當你將數據發送到瀏覽器你逃脫HTML,當你發送給數據庫 - 你是逃避DB特定字符等

+0

同意,但有糾正。 「數據庫特定字符」是一種常見的誤解。沒有「數據庫特定字符」。不同的查詢部分有不同的格式規則。 –

1

不。沒有標準來驗證用戶輸入。

根據它的含義和將來的用途,每一個單獨的值都必須單獨驗證。

2

一切都需要根據驗證滿足您的項目和用例需求。
本地PHP中沒有標準的完美驗證解決方案。
您可以使用優秀的Zend驗證器集合(即使沒有Zend公司)http://framework.zend.com/manual/1.12/en/zend.validate.set.html
這是一個不錯的選擇,因爲他們真的很強大,並且包含所有你現在需要和所有你曾經需要在未來。

0

不要混淆驗證和sanization。以前的答案都非常好,但我只想指出,當需要用戶輸入爲特定格式時應進行驗證。電子郵件是電子郵件,因此您可以將電子郵件發送到有效的電子郵件地址(儘管地址不一定是活動地址)。並且數字是數字,因此可以將輸入插入數據庫的integer/float列中,而不會出現任何問題。

一些驗證任務還有助於保持數據庫/應用程序(如驗證整數)的安全。但如何驗證自由文本,電話號碼,郵政地址等?你需要這種輸入來消毒大部分時間。轉義特殊字符或確保用戶的惡意DELETE *類型的輸入不會被執行。

對於喜歡驗證(而不是消毒)電話號碼,郵政地址等的人來說,互聯網是全球性的(呃,真的......)。根據貴國的格式規則,不要太急於通過使用過於嚴格的驗證規則來限制用戶的輸入。作爲一個本地的芬蘭人,我有很多場合嚴格的格式規則是非常煩人的,有時他們也無法提供正確的信息,因爲編碼器認爲他是非常聰明的定義嚴格的格式,每個人都必須是一個正確的地址格式,因爲這是他的地址的正確格式。

相關問題