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

PHP Filter 過濾器完整指南:驗證與淨化輸入資料

     編輯:PHP 入門

PHP Filter 過濾器完整指南:驗證與淨化輸入資料


簡介

PHP Filter 擴展提供統一、簡便的方式驗證與過濾來自不安全來源的資料(如表單輸入、Cookie、Web Service 回應、伺服器變數、資料庫查詢結果)。PHP 5.2 起內建核心,無需安裝。


核心過濾函數

函數說明PHP 版本
filter_var()過濾單一變數5
filter_var_array()批次過濾多個變數5
filter_input()取得並過濾單一輸入變數 (GET/POST/COOKIE 等)5
filter_input_array()批次取得並過濾多個輸入變數5
filter_list()取得所有支援的過濾器清單5
filter_id()取得指定過濾器的 ID 號5
filter_has_var()檢查指定輸入類型的變數是否存在5

兩大類過濾器

驗證過濾器

  • 嚴格格式規則 (URL、Email、IP、整數、浮點數、布林、正則)
  • 成功返回預期型別,失敗返回 false

淨化過濾器

  • 允許/禁止字串中特定字元,無資料格式規則
  • 永遠返回字串

常用過濾器 ID 速查

過濾器 ID說明
FILTER_VALIDATE_INT驗證整數 (可加 min_range/max_range 選項)
FILTER_VALIDATE_BOOLEAN驗證布林值 ("1","true","on","yes" → true)
FILTER_VALIDATE_FLOAT驗證浮點數
FILTER_VALIDATE_REGEXP依 PCRE 正則驗證
FILTER_VALIDATE_URL驗證 URL (可加 FILTER_FLAG_QUERY_REQUIRED 等旗標)
FILTER_VALIDATE_EMAIL驗證 Email 格式
FILTER_VALIDATE_IP驗證 IP (可限 IPv4/IPv6/非私有/非保留)
FILTER_SANITIZE_STRING移除標籤,編碼/移除特殊字元
FILTER_SANITIZE_STRIPPEDSTRING 別名
FILTER_SANITIZE_ENCODEDURL-encode 字串,移除/編碼特殊字元
FILTER_SANITIZE_SPECIAL_CHARSHTML 轉義 '"<>& 及 ASCII < 32 字元
FILTER_SANITIZE_EMAIL只保留字母數字及 !#$%&'*+-/=?^_`{|}~@.[]
FILTER_SANITIZE_URL只保留字母數字及 $-_.+!*'(),{}|\^~[]`<>#%";/?:@&=
FILTER_SANITIZE_NUMBER_INT只保留數字與 +-
FILTER_SANITIZE_NUMBER_FLOAT只保留數字、+-、.、eE
FILTER_SANITIZE_MAGIC_QUOTES套用 addslashes()
FILTER_UNSAFE_RAW不處理,可配合旗標編碼特殊字元
FILTER_CALLBACK呼叫使用者自定函數進行過濾

選項與旗標

透過關聯陣列 ['options' => [...], 'flags' => ...] 傳遞額外設定。例如:

<?php
$opts = [
    'options' => ['min_range' => 1, 'max_range' => 120],
    'flags' => FILTER_FLAG_ALLOW_OCTAL
];
filter_var($age, FILTER_VALIDATE_INT, $opts);
?>

實用範例

1. 驗證並淨化表單輸入

<?php
$filters = [
    'name'  => FILTER_SANITIZE_STRING,
    'age'   => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]],
    'email' => FILTER_VALIDATE_EMAIL,
];
$result = filter_input_array(INPUT_POST, $filters);

if (!$result['age']) {
    echo "年齡必須在 1~120 之間";
} elseif (!$result['email']) {
    echo "Email 格式錯誤";
} else {
    echo "資料驗證通過";
}
?>

2. 自定義回呼過濾器

<?php
function underscore_to_dot($str) {
    return str_replace('_', '.', $str);
}
$input = 'www_example_com';
echo filter_var($input, FILTER_CALLBACK, ['options' => 'underscore_to_dot']);
// 輸出: www.example.com
?>

3. 檢查 IP 版本

<?php
$ip = '2001:0db8:85a3::8a2e:0370:7334';
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    echo "合法的 IPv6 位址";
}
?>

安全建議

  • 永遠對外部資料進行過濾,即使看似可信來源。
  • 資料庫操作請改用預處理語句,勿仰賴過濾器防 SQL 注入。
  • 輸出到 HTML 前請使用 htmlspecialchars() 或模板引擎自動逃逸,而非單靠 FILTER_SANITIZE_SPECIAL_CHARS。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved