所有外部輸入(表單、Cookie、Server 變數、資料庫結果)皆屬不可信來源。PHP Filter 擴展提供標準化、可複用的驗證與淨化函式,是應用程式安全的第一道防線。
| 類型 | 用途 | 回傳值 | 常見常數 |
|---|---|---|---|
| Validating(驗證) | 檢查格式是否符合預期(Email、URL、IP、Int、Boolean) | 成功回傳對應型別值,失敗回傳 false |
FILTER_VALIDATE_EMAIL, FILTER_VALIDATE_INT, FILTER_VALIDATE_URL |
| Sanitizing(淨化) | 移除或編碼不安全字元,不檢查格式 | 永遠回傳字串 | FILTER_SANITIZE_STRING, FILTER_SANITIZE_EMAIL, FILTER_SANITIZE_URL |
filter_var($var, $filter, $options):單一變數過濾filter_var_array($data, $filters):批次處理陣列filter_input($type, $name, $filter, $options):取得並過濾單一輸入(GET/POST/COOKIE/SERVER/ENV)filter_input_array($type, $filters):批次取得並過濾輸入filter_has_var($type, $name):檢查輸入是否存在$age = 300;
$options = ['options' => ['min_range' => 1, 'max_range' => 120]];
if (filter_var($age, FILTER_VALIDATE_INT, $options) === false) {
echo "年齡必須在 1-120 之間";
}
$email = " User@Example.COM ";
$clean = filter_var($email, FILTER_SANITIZE_EMAIL); // 移除空白、非法字元
if (filter_var($clean, FILTER_VALIDATE_EMAIL)) {
echo "有效 Email:$clean";
}
$filters = [
'name' => ['filter' => 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'] === false) echo "年齡格式錯誤
";
if ($result['email'] === false) echo "Email 格式錯誤
";
if ($result['age'] && $result['email']) echo "資料通過驗證";
function toTitleCase($str) {
return ucwords(strtolower($str));
}
$raw = "jOhN dOe";
$clean = filter_var($raw, FILTER_CALLBACK, ['options' => 'toTitleCase']);
// 結果:John Doe
['options' => [...]] 傳遞,如 min_range, max_range, default, regexp。FILTER_FLAG_STRIP_HIGH, FILTER_FLAG_ENCODE_LOW, FILTER_FLAG_NO_ENCODE_QUOTES。$_GET, $_POST, $_COOKIE, $_SERVER。FILTER_VALIDATE_* 確認格式,而非嘗試過濾已知惡意字串。htmlspecialchars(),SQL 需參數化查詢。FILTER_SANITIZE_STRING 能防 XSS —— 它只移除標籤,屬性、事件處理器可能殘留,輸出端仍需 htmlspecialchars()。FILTER_VALIDATE_URL 不支援國際化域名(IDN),需自行轉碼或用正則補充。filter_input 若輸入不存在回傳 null,驗證失敗回傳 false,三態需嚴格判斷(===)。善用 Filter 擴展,能大幅減少手寫正則與驗證邏輯,提升程式碼可讀性與安全基線。