PHP中使用Filter進行資料安全過濾

來源:互聯網
上載者:User

安全是個永恒的話題,任何一個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;過濾時,返回過濾後內容。
下面是一些使用例子:

 

//整型格式測試<br />$var = '12345';<br />var_dump(filter_var($var, FILTER_VALIDATE_INT));<br />$var = '12B45';<br />var_dump(filter_var($var, FILTER_VALIDATE_INT));<br />//Email格式測試<br />$var = 'linvo@126.com';<br />var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));<br />$var = 'linvo@126com';<br />var_dump(filter_var($var, FILTER_VALIDATE_EMAIL));<br />//IP格式測試<br />$var = '11.22.33.44';<br />var_dump(filter_var($var, FILTER_VALIDATE_IP));<br />$var = '111.222.333.444';<br />var_dump(filter_var($var, FILTER_VALIDATE_IP));<br />//URL格式測試<br />$var = 'http://www.linvo2008.cn/blog';<br />var_dump(filter_var($var, FILTER_VALIDATE_URL));<br />$var = 'www.linvo2008.cn/blog';<br />var_dump(filter_var($var, FILTER_VALIDATE_URL));<br />//去除超文字標籤測試<br />$var = 'This is a <a href="#" mce_href="#">link</a> test!';<br />var_dump(filter_var($var, FILTER_SANITIZE_STRING)); 

 

大家可以自己運行一下看看結果。另外,對於第三個$options參數,可以對驗證類型進行詳細設定。比如驗證IP時,可以通過該參數設定過濾規則為IPv4還是IPv6:

 

//IPv6格式測試(支援縮寫形式)<br />$var = '2001:0db8:85a3::1319:8a2e:0370:7344';<br />var_dump(filter_var($var, FILTER_VALIDATE_IP, FILTER_FLAG_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

<form action="do.php" method="post"><br /><label>Name:</label><br /><input name="name" type="text" /><br /><label>QQ:</label><br /><input name="qq" type="text" /><br /><label>Email:</label><br /><input name="email" type="text" /><br /><label>Blog:</label><br /><input name="blog" type="text" /><br /><input type="submit" /><br /></form> 

 

file:do.php

$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);<br />$qq = filter_input(INPUT_POST, 'qq', FILTER_VALIDATE_INT);<br />$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);<br />$blog = filter_input(INPUT_POST, 'blog', FILTER_VALIDATE_URL);<br />$error = '<em>Error</em>';<br />echo 'Name:',$name;<br />$msg = $qq === false ? $error : $qq;<br />echo 'QQ:',$msg;<br />$msg = $email === false ? $error : $email;<br />echo 'Email:',$msg;<br />$msg = $blog === false ? $error : $blog;<br />echo 'Blog:',$msg; 

 

index.html頁面示範效果(提交前):

do.php頁面示範效果(提交後):

到這裡,大家應該基本掌握了Filter的使用了,更多用途等待大家自己去發掘:)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.