
- PHP 教程
- PHP - 首頁
- PHP - 簡介
- PHP - 安裝
- PHP - 歷史
- PHP - 特性
- PHP - 語法
- PHP - Hello World
- PHP - 註釋
- PHP - 變數
- PHP - Echo/Print
- PHP - var_dump
- PHP - $ 和 $$ 變數
- PHP - 常量
- PHP - 魔術常量
- PHP - 資料型別
- PHP - 型別轉換
- PHP - 型別混雜
- PHP - 字串
- PHP - 布林值
- PHP - 整數
- PHP - 檔案與I/O
- PHP - 數學函式
- PHP - Heredoc & Nowdoc
- PHP - 複合型別
- PHP - 檔案包含
- PHP - 日期與時間
- PHP - 標量型別宣告
- PHP - 返回型別宣告
- PHP 運算子
- PHP - 運算子
- PHP - 算術運算子
- PHP - 比較運算子
- PHP - 邏輯運算子
- PHP - 賦值運算子
- PHP - 字串運算子
- PHP - 陣列運算子
- PHP - 條件運算子
- PHP - 展開運算子
- PHP - 空值合併運算子
- PHP - 比較運算子(飛船運算子)
- PHP 控制語句
- PHP - 決策
- PHP - If…Else 語句
- PHP - Switch 語句
- PHP - 迴圈型別
- PHP - For 迴圈
- PHP - Foreach 迴圈
- PHP - While 迴圈
- PHP - Do…While 迴圈
- PHP - Break 語句
- PHP - Continue 語句
- PHP 函式
- PHP - 函式
- PHP - 函式引數
- PHP - 按值傳遞
- PHP - 按引用傳遞
- PHP - 預設引數
- PHP - 具名引數
- PHP - 可變引數
- PHP - 返回值
- PHP - 傳遞函式
- PHP - 遞迴函式
- PHP - 型別提示
- PHP - 變數作用域
- PHP - 嚴格型別
- PHP - 匿名函式
- PHP - 箭頭函式
- PHP - 可變函式
- PHP - 區域性變數
- PHP - 全域性變數
- PHP 超全域性變數
- PHP - 超全域性變數
- PHP - $GLOBALS
- PHP - $_SERVER
- PHP - $_REQUEST
- PHP - $_POST
- PHP - $_GET
- PHP - $_FILES
- PHP - $_ENV
- PHP - $_COOKIE
- PHP - $_SESSION
- PHP 檔案處理
- PHP - 檔案處理
- PHP - 開啟檔案
- PHP - 讀取檔案
- PHP - 寫入檔案
- PHP - 檔案是否存在
- PHP - 下載檔案
- PHP - 複製檔案
- PHP - 追加檔案
- PHP - 刪除檔案
- PHP - 處理CSV檔案
- PHP - 檔案許可權
- PHP - 建立目錄
- PHP - 列出檔案
- 面向物件的PHP
- PHP - 面向物件程式設計
- PHP - 類和物件
- PHP - 建構函式和解構函式
- PHP - 訪問修飾符
- PHP - 繼承
- PHP - 類常量
- PHP - 抽象類
- PHP - 介面
- PHP - 特性
- PHP - 靜態方法
- PHP - 靜態屬性
- PHP - 名稱空間
- PHP - 物件迭代
- PHP - 封裝
- PHP - final 關鍵字
- PHP - 過載
- PHP - 克隆物件
- PHP - 匿名類
- PHP Web開發
- PHP - Web 概念
- PHP - 表單處理
- PHP - 表單驗證
- PHP - 表單郵件/URL
- PHP - 完整表單
- PHP - 檔案包含
- PHP - GET & POST
- PHP - 檔案上傳
- PHP - Cookie
- PHP - Session
- PHP - Session 選項
- PHP - 傳送郵件
- PHP - 輸入過濾
- PHP - Post-Redirect-Get (PRG)
- PHP - Flash 訊息
- PHP 高階
- PHP - MySQL
- PHP.INI 檔案配置
- PHP - 陣列解構
- PHP - 程式碼規範
- PHP - 正則表示式
- PHP - 錯誤處理
- PHP - Try…Catch
- PHP - Bug 除錯
- PHP - 針對C語言開發者
- PHP - 針對PERL語言開發者
- PHP - 框架
- PHP - Core PHP vs 框架
- PHP - 設計模式
- PHP - 過濾器
- PHP - JSON
- PHP - 異常
- PHP - 特殊型別
- PHP - 雜湊
- PHP - 加密
- PHP - is_null() 函式
- PHP - 系統呼叫
- PHP - HTTP 認證
- PHP - 交換變數
- PHP - Closure::call()
- PHP - 過濾後的 unserialize()
- PHP - IntlChar
- PHP - CSPRNG
- PHP - 期望值
- PHP - use 語句
- PHP - 整數除法
- PHP - 已棄用的特性
- PHP - 已移除的擴充套件和SAPI
- PHP - PEAR
- PHP - CSRF
- PHP - FastCGI 程序
- PHP - PDO 擴充套件
- PHP - 內建函式
- PHP 有用資源
- PHP - 速查表
- PHP - 問答
- PHP - 快速指南
- PHP - 線上編譯器
- PHP - 有用資源
- PHP - 討論
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 )