PHP 過濾器用於驗證和過濾來自非安全來源的數據,例如使用者的輸入。
什麼是 PHP 過濾器?
PHP 篩選器用於驗證和過濾來自非安全性來源的資料。
測試、驗證和過濾使用者輸入或自訂資料是任何 Web 應用程式的重要組成部分。
PHP 的過濾器擴充功能的設計目的是讓資料過濾更輕鬆快速。
為什麼要使用篩選器?
幾乎所有的 Web 應用程式都依賴外部的輸入。這些數據通常來自使用者或其他應用程式(例如 web 服務)。透過使用過濾器,您能夠確保應用程式獲得正確的輸入類型。
您應該始終對外部資料進行過濾!
輸入過濾是最重要的應用程式安全主題之一。
什麼是外部資料?
1. 來自表單的輸入資料
2. Cookies
3. Web services data
4. 伺服器變數
5 .資料庫查詢結果
函數與篩選器
#如需篩選變量,請使用下面的篩選函數之一:
• filter_var() - 透過一個指定的過濾器來過濾單一的變數
• filter_var_array() - 透過相同的或不同的過濾器來過濾多個變數
• filter_input - 取得一個輸入變量,並對它進行過濾
• filter_input_array - 取得多個輸入變量,並透過相同的或不同的過濾器對它們進行過濾
在下面的實例中,我們用filter_var() 函數驗證了一個整數:
<?php $int = 123; if(!filter_var($int, FILTER_VALIDATE_INT)) { echo("不是一个合法的整数"); } else { echo("是个合法的整数"); } ?>
上面的程式碼使用了"FILTER_VALIDATE_INT" 過濾器來過濾變數。由於這個整數是合法的,因此上面的程式碼將輸出:
是個合法的整數
如果我們嘗試使用一個非整數的變數(例如"123abc"),則輸出:"Integer is not valid"。
如需查看完整的函數和篩選器列表,請造訪我們的 PHP Filter 參考手冊。
Validating 和Sanitizing
有兩個篩選器:
Validating 過濾器:
• 用於驗證使用者輸入
• 嚴格的格式規則(例如URL 或E-Mail 驗證)
• 如果成功則回傳預期的類型,如果失敗則傳回FALSE
Sanitizing 篩選器:
• 用於允許或禁止字串中指定的字元
• 無資料格式規則
• 總是傳回字串
選項和標誌
#選項和標誌用於為指定的篩選器新增額外的篩選選項。
不同的濾鏡有不同的選項和標誌。
在下面的實例中,我們用filter_var() 和"min_range" 以及"max_range" 選項驗證了一個整數:
<?php $var=300; $int_options = array( "options"=>array ( "min_range"=>0, "max_range"=>256 ) ); if(!filter_var($var, FILTER_VALIDATE_INT, $int_options)) { echo("不是一个合法的整数"); } else { echo("是个合法的整数"); } ?>
就像上面的程式碼一樣,選項必須放入一個名為" options" 的相關數組中。如果使用標誌,則不需要在數組內。
由於整數是"300",它不在指定的範圍內,以上程式碼的輸出將會是:
##不是一個合法的整數
驗證輸入
#讓我們試著驗證來自表單的輸入。 我們需要做的第一件事情是確認是否存在我們正在尋找的輸入資料。 然後我們用 filter_input() 函數過濾輸入的資料。 在下面的實例中,輸入變數"email" 被傳到PHP 頁面:<?php if(!filter_has_var(INPUT_GET, "email")) { echo("没有 email 参数"); } else { if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) { echo "不是一个合法的 E-Mail"; } else { echo "是一个合法的 E-Mail"; } } ?>以上實例測試結果如下:
實例解釋
上面的實例有一個透過"GET" 方法傳送的輸入變數(email):檢測是否存在"GET" 類型的"email"輸入變數如果存在輸入變量,偵測它是否為有效的e-mail 位址淨化輸入
讓我們試著清理一下從表單傳來的URL。 首先,我們要確認是否存在我們正在尋找的輸入資料。 然後,我們用 filter_input() 函數來淨化輸入資料。 在下面的實例中,輸入變數"url" 被傳到PHP 頁面:<?php if(!filter_has_var(INPUT_GET, "url")) { echo("没有 url 参数"); } else { $url = filter_input(INPUT_GET, "url", FILTER_SANITIZE_URL); echo $url; } ?>
實例解釋
上面的實例有一個通過"GET" 方法傳送的輸入變數(url):偵測是否存在"GET" 類型的"url" 輸入變數如果存在此輸入變量,對其進行淨化(刪除非法字元),並將其儲存在$url 變數中假如輸入變數是類似這樣的字串:"http://www.ruåånoøøob.com/",則淨化後的$url 變數如下所示:#過濾多個輸入
表單通常由多個輸入欄位組成。為了避免對 filter_var 或 filter_input 函數重複調用,我們可以使用 filter_var_array 或 the filter_input_array 函數。 在本例中,我們使用 filter_input_array() 函數來過濾三個 GET 變數。接收到的 GET 變數是一個名字、一個年齡、一個 e-mail 位址:<?php $filters = array ( "name" => array ( "filter"=>FILTER_SANITIZE_STRING ), "age" => array ( "filter"=>FILTER_VALIDATE_INT, "options"=>array ( "min_range"=>1, "max_range"=>120 ) ), "email"=> FILTER_VALIDATE_EMAIL ); $result = filter_input_array(INPUT_GET, $filters); if (!$result["age"]) { echo("年龄必须在 1 到 120 之间。<br>"); } elseif(!$result["email"]) { echo("E-Mail 不合法<br>"); } else { echo("输入正确"); } ?>
實例解釋#
上面的實例有三個透過"GET" 方法傳送的輸入變數(name、age 和email):
1. 設定一個數組,其中包含了輸入變數的名稱和用於指定的輸入變數的篩選器
2. 呼叫filter_input_array() 函數,參數包含GET 輸入變數及剛才設定的陣列
3. 偵測$result 變數中的"age" 和"email" 變數是否有非法的輸入。 (如果有非法輸入,則在使用 filter_input_array() 函數之後,輸入變數為 FALSE。)
filter_input_array() 函數的第二個參數可以是陣列或單一篩選器的 ID。
如果該參數是單一過濾器的 ID,那麼這個指定的過濾器會過濾輸入數組中所有的值。
如果該參數是一個數組,那麼此數組必須遵循下面的規則:
必須是一個關聯數組,其中包含的輸入變數是數組的鍵(例如"age" 輸入變量)
此數組的值必須是過濾器的ID ,或者是規定了過濾器、標誌和選項的數組
使用Filter Callback
透過使用FILTER_CALLBACK 過濾器,可以呼叫自訂的函數,把它當作一個過濾器來使用。這樣,我們就擁有了資料過濾的完全控制權。
您可以建立自己的自訂函數,也可以使用已存在的 PHP 函數。
將您準備用到的篩選器的函數,依照指定選項的規定方法進行規定。在關聯數組中,帶有名稱 "options"。
在下面的實例中,我們使用了一個自訂的函數把所有"_" 轉換為空格:
<?php function convertSpace($string) { return str_replace("_", ".", $string); } $string = "www_php_com!"; echo filter_var($string, FILTER_CALLBACK, array("options"=>"convertSpace")); ?>
上面程式碼的結果如下所示:
www.php.com
實例解釋
上面的實例把所有"_" 轉換成"." :
1. 建立一個把"_" 替換為"." 的函數
2. 呼叫filter_var() 函數,它的參數是FILTER_CALLBACK 過濾器以及包含我們的函數的陣列