2015-12-30 50 views
0

考慮以下代碼:PHP - 當過濾用戶輸入

// store the $name into a database 
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING); 

// already encrypted password (client-side) and will be salted or hashed again to store it into DB 
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING); 

// just to check if the $lang is on the $language array i.e. in_array($lang, $language) 
$lang = filter_input(INPUT_POST, 'language', FILTER_SANITIZE_STRING); 

// just to echo something 
$sth = filter_input(INPUT_POST, 'sth', FILTER_SANITIZE_STRING); 

在這裏,我試圖描述的一些情況。並且在每種情況下,我篩選了用戶輸入(在某些情況下不需要)。我的問題是何時過濾用戶輸入,因爲它似乎過濾用戶輸入並不總是必要的。

+0

您應該*總是*過濾用戶輸入。永遠不要相信他們的輸入。請使用PHP的[內置函數](http://jayblanchard.net/proper_password_hashing_with_PHP.html)來處理密碼安全性。如果您使用的PHP版本低於5.5,則可以使用'password_hash()'[兼容包](https://github.com/ircmaxell/password_compat)。 –

+1

對於SQL查詢,您應該瞭解[PDO](http://php.net/manual/en/pdo.prepared-statements)的[prepared](http://en.wikipedia.org/wiki/Prepared_statement)語句。 php)和[MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php),並考慮使用PDO,[這真的很簡單](http://jayblanchard.net/demystifying_php_pdo的.html)。 –

+0

它不是正確的問題要求在stackoverflow,請刪除它 –

回答

0

這種力量給你一個更好的理解輸入驗證:

輸入驗證兩者最根本的防禦Web應用程序依賴和最不可靠的。絕大多數Web應用程序漏洞都是由驗證失敗引起的,因此將這部分防禦措施正確對待至關重要。即使我們似乎已經把它降下來了,我們仍需要注意以下幾點。

無論何時執行自定義驗證器或採用第三方驗證庫,您都應該記住這些。當談到第三方驗證器時,也要考慮到這些通常是普通的,並且很可能會忽略Web應用程序需要的關鍵特定驗證例程。與任何面向安全性的庫一樣,請務必親自檢查您的首選庫是否存在缺陷和限制。值得注意的是,PHP並沒有超出一些奇怪的可疑的不安全行爲。從PHP的過濾器功能請看下面的例子:


filter_var('php://', FILTER_VALIDATE_URL); 

上面的例子通過過濾器沒有問題。接受php:// URL的問題在於它可以傳遞給PHP函數,該函數希望檢索遠程HTTP URL,而不是從執行PHP(通過PHP包裝器)返回數據。上面的缺陷是過濾器選項沒有限制允許的URI方案的方法,用戶期望它是http,https或mailto之一,而不是一些通用的PHP特定的URI。這是我們應該不惜一切代價避免的通用驗證方法。

更多詳細信息請參閱:http://phpsecurity.readthedocs.org/en/latest/Input-Validation.html