PHP – 過濾器



在PHP應用程式中處理客戶端請求接收到的輸入資料之前,進行資料驗證非常重要。為了執行輸入驗證,PHP中的filter擴充套件提供了許多filter函式,並由預定義的filter常量和標誌支援。PHP庫的filter擴充套件還有助於清理透過GET或POST方法接收到的輸入。

filter擴充套件是一個強大的功能,有助於防止安全漏洞,例如SQL注入和跨站點指令碼攻擊。此擴充套件包含兩種型別的過濾器:

驗證過濾器

驗證過濾器檢查資料是否滿足某些條件。例如,您希望確保使用者已在HTML表單中正確輸入電子郵件欄位。FILTER_VALIDATE_EMAIL將確定資料是否是有效的電子郵件地址。但是,驗證過濾器不會更改資料本身。

清理過濾器

清理是指從輸入中刪除不需要的字元的過程。因此,它可能會透過刪除不需要的字元來更改資料。例如,傳入FILTER_SANITIZE_EMAIL將刪除電子郵件地址中不應包含的不合適的字元,而無需執行驗證。

過濾器標誌

PHP中的filter擴充套件定義了許多過濾器標誌,如下所示:

序號 ID 和描述
1

FILTER_FLAG_STRIP_LOW

刪除數值<32的字元。

2

FILTER_FLAG_STRIP_HIGH

刪除數值>127的字元。

3

FILTER_FLAG_STRIP_BACKTICK

刪除反引號字元。

4

FILTER_FLAG_ALLOW_FRACTION

允許使用句點(.)作為數字的小數分隔符。

5

FILTER_FLAG_ALLOW_THOUSAND

允許使用逗號(,)作為數字的千位分隔符。

6

FILTER_FLAG_ALLOW_SCIENTIFIC

允許使用e或E表示數字的科學計數法。

7

FILTER_FLAG_NO_ENCODE_QUOTES

如果存在此標誌,則不會編碼單引號(')和雙引號(")。

8

FILTER_FLAG_ENCODE_LOW

編碼所有數值<32的字元。

9

FILTER_FLAG_ENCODE_HIGH

編碼所有數值>127的字元。

10

FILTER_FLAG_ENCODE_AMP

編碼和號(&)。

11

FILTER_NULL_ON_FAILURE

對於無法識別的值返回null

12

FILTER_FLAG_ALLOW_OCTAL

將以零(0)開頭的輸入視為八進位制數。

13

FILTER_FLAG_ALLOW_HEX

將以0x或0X開頭的輸入視為十六進位制數。

14

FILTER_FLAG_EMAIL_UNICODE

允許電子郵件地址的本地部分包含Unicode字元。

15

FILTER_FLAG_IPV4

允許IP地址為IPv4格式。

16

FILTER_FLAG_IPV6

允許IP地址為IPv6格式。

17

FILTER_FLAG_NO_PRIV_RANGE

對於以下私有IPv4範圍驗證失敗:10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。

18

FILTER_FLAG_NO_RES_RANGE

對於以下保留的IPv4範圍驗證失敗:0.0.0.0/8、169.254.0.0/16、127.0.0.0/8和240.0.0.0/4。

對於以下保留的IPv6範圍驗證失敗:::1/128、::/128、::ffff:0:0/96和fe80::/10。

19

FILTER_FLAG_GLOBAL_RANGE

對於非全域性IPv4/IPv6範圍驗證失敗

20

FILTER_FLAG_SCHEME_REQUIRED

要求URL包含方案部分。

21

FILTER_FLAG_HOST_REQUIRED

要求URL包含主機部分。

22

FILTER_FLAG_PATH_REQUIRED

要求URL包含路徑部分。

23

FILTER_FLAG_QUERY_REQUIRED

要求URL包含查詢字串。

24

FILTER_REQUIRE_SCALAR

要求值為標量。

25

FILTER_REQUIRE_ARRAY

要求值為陣列。

26

FILTER_FORCE_ARRAY

如果值為標量,則將其視為僅包含標量值的陣列。

過濾器函式

filter擴充套件包含以下過濾器函式

序號 ID 和描述
1

filter_has_var()

檢查指定型別的變數是否存在

2

filter_id()

返回屬於指定名稱過濾器的過濾器 ID

3

filter_input_array()

獲取外部變數並對其進行可選過濾

4

filter_input()

按名稱獲取特定外部變數並對其進行過濾

5

filter_list()

返回所有支援的過濾器的列表

6

filter_var_array()

獲取多個變數並對其進行可選過濾

7

filter_var()

使用指定的過濾器過濾變數

預定義常量

以上函式使用一個名為 input_type 的引數,該引數是預定義的列舉常量之一,表示輸入是如何被提供給 PHP 指令碼進行過濾的。

常量 型別
INPUT_POST (int)

POST 變數

INPUT_GET (int)

GET 變數

INPUT_COOKIE (int)

COOKIE 變數

INPUT_ENV (int)

ENV 變數

INPUT_SERVER (int) SERVER 變數
INPUT_SESSION (int) SESSION 變數
INPUT_REQUEST (int) REQUEST 變數

filter_has_var() 函式

filter_has_var() 函式檢查指定型別的變數是否存在。

filter_has_var(int $input_type, string $var_name): bool

input_type 是預定義常量 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV 之一;而 var_name 引數是要檢查的變數的名稱。函式在成功時返回 true,失敗時返回 false。

示例

在 XAMPP 伺服器上訪問以下 PHP 指令碼。

<?php
   if (!filter_has_var(INPUT_GET, "email")) {
      echo("Email not found");
   } else {
      echo("Email found");
   }
?>

它將產生以下 **輸出** −

訪問 **https:///hello.php?email=abc@example.com**

Email found

filter_input() 函式

filter_input() 函式按名稱獲取特定外部變數,並根據應用的過濾器常量對其進行過濾。

filter_input(
   int $type,
   string $var_name,
   int $filter = FILTER_DEFAULT,
   array|int $options = 0
): mixed

type 引數是常量 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV 之一。第二個引數是 var_name,要獲取的變數的名稱。您可以使用要應用的過濾器。使用任何預定義的過濾器標誌。如果省略,將使用 FILTER_DEFAULT

函式在成功時返回請求變數的值,如果過濾器失敗則返回 false,如果 var_name 變數未設定則返回 null。

示例

請看下面的例子 −

<?php
   if (!filter_input(INPUT_GET, "email", FILTER_VALIDATE_EMAIL)) {
      echo("Email is not valid");
   } else {
      echo("Email is valid");
   }
?>

它將產生以下 **輸出** −

如果您使用 URL **https:///hello.php?email=abc@example.com**,

Email is valid

如果 URL 是 **https:///hello.php?email=a b c@example.com**,

Email is not valid

您也可以使用 INPUT_POST 型別來驗證透過 POST 方法接收的輸入 −

<?php
   if (!filter_input(INPUT_POST, "email", FILTER_VALIDATE_EMAIL)) {
      echo("Email is not valid");
   } else {
      echo("Email is valid");
   }
?>

要使用 POST 請求傳遞資料,請開啟命令提示符,並使用以下 CURL 命令

curl -X POST -d "{\"email\": \"a@b.com\"}" https:///hello.php

filter_list() 函式

filter_list() 函式返回所有支援的過濾器的列表。

filter_list(): array

示例

該函式返回所有支援的過濾器的名稱陣列,如果沒有這樣的過濾器則返回空陣列。

<?php
   print_r(filter_list());
?>

它將產生以下 **輸出** −

Array
(
   [0] => int
   [1] => boolean
   [2] => float
   [3] => validate_regexp
   [4] => validate_domain
   [5] => validate_url
   [6] => validate_email
   [7] => validate_ip
   [8] => validate_mac
   [9] => string
   [10] => stripped
   [11] => encoded
   [12] => special_chars
   [13] => full_special_chars
   [14] => unsafe_raw
   [15] => email
   [16] => url
   [17] => number_int
   [18] => number_float
   [19] => add_slashes
   [20] => callback
)

filter_input_array() 函式

filter_input_array() 獲取外部變數並對其進行可選過濾。

filter_input_array(int $type, array|int $options = FILTER_DEFAULT, 
   bool $add_empty = true): array|false|null

此函式對於在不重複呼叫 filter_input() 的情況下檢索多個值非常有用。

type 引數是 INPUT_GET、INPUT_POST、INPUT_COOKIE、INPUT_SERVER 或 INPUT_ENV 之一。

options 引數是一個定義引數的陣列。有效的鍵是包含變數名稱的字串,有效的 value 或者是過濾器型別,或者是一個數組,可選地指定過濾器、標誌和選項。此引數也可以是一個整數,包含一個過濾器常量。然後輸入陣列中的所有值都將透過此過濾器進行過濾。

該函式在成功時返回一個包含請求變數值的陣列。如果由 type 指定的輸入陣列未填充,則如果未給出 FILTER_NULL_ON_FAILURE 標誌,則函式返回 null,否則返回 false。對於其他失敗,返回 false。

示例

要在 HTTP 請求中包含陣列,我們使用“hello.html”中的以下 HTML 表單,並透過 POST 方法傳送。

<!DOCTYPE html>
<html>
<body>
   <h1>Filter Input Array</h1>
   <form action="hello.php" method="POST">
      <p><label for="email">Enter your email:</label>
      <input type="text" id="email" name="email"></p>
      <p><label for="age">Enter your age<label>
      <input type = "text" id="age" name="age"></p>
      <input type="submit">
   </form>
</body>
</html>

驗證輸入陣列的 PHP 指令碼如下所示 −

<?php
   $filters = array (
      "age" => array ("filter"=>FILTER_VALIDATE_INT, 	
         "options"=>array("min_range"=>20,"max_range"=>40) ),
      "email" => FILTER_VALIDATE_EMAIL
   );
   print_r(filter_input_array(INPUT_POST, $filters));
?>

開啟 HTML 表單並輸入 30 作為年齡,**abc@example.com** 作為電子郵件,結果將是一個數組,驗證這兩個輸入 −

Array ( [age] => 30 [email] => abc@example.com )

嘗試給出無效的輸入,例如“age=15”。輸出陣列將為 **age** 鍵顯示空值。

Array ( [age] => [email] => abc@example.com )
廣告