首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP filter_input() 深度解析:輸入驗證與過濾的現代原生方案

     編輯:PHP 綜合知識

PHP 5.2 引入 **Filter 擴充套件**,提供 filter_input()、filter_var() 等原生函數,**無需撰寫正則即可完成常見輸入驗證/過濾**。本文詳細說明 filter_input() 語法、輸入來源常數、過濾器/驗證器旗標、實戰範例與**已知陷阱**(布林驗證行為),助你建構安全、可維護的輸入處理層。

一、語法與參數

filter_input(int $type, string $var_name, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed
  • $type:輸入來源常數(見下表)。
  • $var_name:變數名稱(如 'email')。
  • $filter:過濾器/驗證器 ID(見下表)。
  • $options:旗標陣列或位元組合(如 FILTER_FLAG_STRIP_HIGH)。
  • **回傳**:過濾後的值、false(驗證失敗)、null(變數不存在)。

二、輸入來源常數

常數對應超全域變數說明
INPUT_GET$_GET查詢字串參數
INPUT_POST$_POSTPOST 表單資料
INPUT_COOKIE$_COOKIECookie
INPUT_SERVER$_SERVER伺服器/執行環境資訊
INPUT_ENV$_ENV環境變數

三、常用過濾器/驗證器

分類常數用途典型旗標
驗證FILTER_VALIDATE_INT整數驗證min_range, max_range
FILTER_VALIDATE_FLOAT浮點數驗證decimal, min_range, max_range
FILTER_VALIDATE_EMAILEmail 格式驗證FILTER_FLAG_EMAIL_UNICODE
FILTER_VALIDATE_URLURL 格式驗證FILTER_FLAG_PATH_REQUIRED, QUERY_REQUIRED
FILTER_VALIDATE_IPIP 驗證FILTER_FLAG_IPV4, IPV6, NO_PRIV_RANGE, NO_RES_RANGE
FILTER_VALIDATE_BOOLEAN布林驗證 (見陷阱)FILTER_NULL_ON_FAILURE
FILTER_VALIDATE_REGEXP自訂正則驗證regexp
過濾FILTER_SANITIZE_STRING移除標籤、編碼特殊字元 (PHP 8.1 棄用,改用 htmlspecialchars)FILTER_FLAG_STRIP_LOW, STRIP_HIGH, ENCODE_LOW, ENCODE_HIGH
FILTER_SANITIZE_EMAIL移除非法 Email 字元
FILTER_SANITIZE_URL移除非法 URL 字元
FILTER_SANITIZE_NUMBER_INT只保留數字、正負號
FILTER_SANITIZE_NUMBER_FLOAT保留數字、小數點、指數符號FILTER_FLAG_ALLOW_FRACTION, ALLOW_THOUSAND, ALLOW_SCIENTIFIC
FILTER_SANITIZE_FULL_SPECIAL_CHARSHTML 實體編碼 (等同 htmlspecialchars ENT_QUOTES)

四、實戰範例

<?php
// 1. 取得並驗證整數 ID (1~1000)
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 1000]
]);
if ($id === false || $id === null) {
    die('無效 ID');
}

// 2. 取得並過濾 Email
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    die('Email 格式錯誤');
}

// 3. 批次處理表單 (搭配 filter_input_array)
$filters = [
    'username' => FILTER_SANITIZE_STRING,
    'age'      => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range'=>18]],
    'email'    => FILTER_VALIDATE_EMAIL,
    'tags'     => ['filter' => FILTER_SANITIZE_STRING, 'flags' => FILTER_REQUIRE_ARRAY],
];
$data = filter_input_array(INPUT_POST, $filters);
// $data['age'] 可能為 false/null,需額外檢查

五、重大陷阱:FILTER_VALIDATE_BOOLEAN 行為

var_dump(filter_var('abc', FILTER_VALIDATE_BOOLEAN)); // bool(false)
var_dump(filter_var('0',   FILTER_VALIDATE_BOOLEAN)); // bool(false)  <-- 字串 "0" 視為 false
var_dump(filter_var('1',   FILTER_VALIDATE_BOOLEAN)); // bool(true)
var_dump(filter_var('on',  FILTER_VALIDATE_BOOLEAN)); // bool(true)
var_dump(filter_var('yes', FILTER_VALIDATE_BOOLEAN)); // bool(true)
var_dump(filter_var('',    FILTER_VALIDATE_BOOLEAN)); // bool(false)

陷阱:字串 "0" 被視為 false,**但 "false" 字串卻回傳 true**(非空字串預設真)。若需嚴格 "true"/"false" 對應,請自訂驗證或使用 FILTER_VALIDATE_REGEXP。

六、filter_input() vs filter_var() 選用指南

場景推薦函數理由
直接從超全域變數取得並驗證filter_input()來源明確、不受變數覆蓋影響、可偵測變數是否存在
已有變數值(如經處理後)需再次驗證filter_var()輸入靈活、可對任意字串/變數操作
批次處理整個 $_POST/$_GETfilter_input_array()單次呼叫定義規則陣列、回傳結構化結果

七、現代專案整合建議

  • 表單請求物件:封裝 filter_input_array 為 Request::validated(),集中管理規則。
  • 搭配驗證庫:Laravel Validator、Symfony Validator、Respect\Validation 底層多呼叫 Filter 函數,上層提供更豐富規則與錯誤訊息。
  • PHP 8.1+ 注意:FILTER_SANITIZE_STRING 已棄用,**改用 htmlspecialchars()** 或 FILTER_SANITIZE_FULL_SPECIAL_CHARS。
  • 不要過度依賴:Filter 只能處理**單一欄位、單一規則**;複雜業務規則(跨欄位、資料庫查重)仍需自訂邏輯。

善用 filter_input() 可消除大量手寫正則與 isset/empty 判斷,建立**宣告式、可測試、安全**的輸入邊界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved