PHP中使用Filter進行資料安全過濾
安全是個永恒的話題,任何一個PHPer都免不了要過資料驗證及過濾這一關。通常的驗證方法,相信只要有點經驗的PHPer都能寫個八九不離十,只是安全性高低的問題。這裡我來介紹一種利用PHP的Filter來進行驗證的方法,既簡單又高效。
Filter曾作為PHP擴充(PECL)的一部分,使用時需要載入外部庫檔案,但在PHP 5.2之後的版本已編譯到PHP中,使用時無需載入。目前filter提供函數有:filter_has_var、filter_id、 filter_input_array、filter_input、filter_var_array、filter_var。限於篇幅,這裡只介紹兩個最常使用的,filter_var和filter_input。filter_var用於頁面內部變數的內容過濾,filter_input用於外部變數(如POST、GET、COOKIE等)的內容過濾。
?
首先來介紹filter_var函數,先看下函數原型:
mixed filter_var ( mixed $variable [, int $filter [, mixed $options ]] )
$variable——要過濾的變數
$filter——要過濾的類型ID常量
$options——過濾型別參數
其中需要重點掌握的是$filter參數,它是一些有特殊含義的預定義常量,如:FILTER_VALIDATE_INT代表驗證整數型變數,FILTER_VALIDATE_EMAIL代表驗證email格式等。(更多常量可以查看PHP手冊關於Filter部分的內容,裡面有該參數的詳細列表)
對於傳回值的情況,匹配時,匹配正確返回原內容,匹配錯誤時返回false;過濾時,返回過濾後內容。
下面是一些使用例子:
array("min_range"=>0, "max_range"=>256));var_dump(filter_var($var, FILTER_VALIDATE_INT, $int_options))//Email格式測試$var = [email protected]';var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));$var = [email protected]';var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));//IP格式測試$var = '11.22.33.44';var_dump(filter_var($var, FILTER_VALIDATE_IP));$var = '111.222.333.444';var_dump(filter_var($var, FILTER_VALIDATE_IP));//URL格式測試$var = 'http://www.linvo2008.cn/blog';var_dump(filter_var($var, FILTER_VALIDATE_URL));$var = 'www.linvo2008.cn/blog';var_dump(filter_var($var, FILTER_VALIDATE_URL));//去除超文字標籤測試$var = 'This is a link test!';var_dump(filter_var($var, FILTER_SANITIZE_STRING));?
大家可以自己運行一下看看結果。另外,對於第三個$options參數,可以對驗證類型進行詳細設定。比如驗證IP時,可以通過該參數設定過濾規則為IPv4還是IPv6:
?
?其他詳細參數見PHP手冊。
?
以上是頁面內部變數的過濾,但我們希望的是可以直接驗證使用者輸入的資料,這些資料是外部變數過來的,這就用到了filter_input函數:
mixed filter_input ( int $type , string $variable_name [, int $filter [, mixed $options ]] )
從函數原型可以看出,除了原來那三個參數外,多了第一個$type參數。該參數用於設定要過濾變數所在的數組,也就相當於:post方式過來的儲存在$_POST數組中;get方式過來的儲存在$_GET數組中一樣。它也是通過預定義常量進行設定的,如:post對應INPUT_POST,get對應INPUT_GET等。(更多常量見PHP手冊)
下面也來個例子吧,該例子由兩個頁面組成:index.html前端表單頁面;do.php後端處理頁面。
file:index.html
?
?file:do.php
?
Error';echo 'Name:',$name;$msg = $qq === false ? $error : $qq;echo 'QQ:',$msg;$msg = $email === false ? $error : $email;echo 'Email:',$msg;$msg = $blog === false ? $error : $blog;echo 'Blog:',$msg;
?index.html頁面示範效果(提交前):
do.php頁面示範效果(提交後):
到這裡,大家應該基本掌握了Filter的使用了,更多用途等待大家自己去發掘:)
?
參考:http://www.w3school.com.cn/php/php_ref_filter.asp
?
?
?
?
?
?
?