所有來自 $_GET、$_POST、$_COOKIE、$_REQUEST、$_SERVER 的資料皆視為汙染資料,必須經過適當過濾後才能用於 SQL 查詢、HTML 輸出、Shell 指令等敏感操作。
| 函式 | 用途 | 適用場景 | 注意事項 |
|---|---|---|---|
htmlspecialchars() |
將特殊字元轉為 HTML 實體 | HTML 輸出防 XSS | 預設僅轉換 & " ' < >,建議加 ENT_QUOTES 與編碼參數 |
htmlentities() |
所有可轉換字元轉為 HTML 實體 | 完整 HTML 實體化 | 處理雙位元組字元需指定編碼,否則用 ISO-8859-1 |
strip_tags() |
移除 HTML/JS/PHP 標籤 | 允許部分標籤的富文本 | 第二參數可保留特定標籤,但屬性仍可能含 XSS 風險 |
addslashes() |
為引號、反斜線、NULL 加反斜線 | 舊版 SQL 字串跳脫 | 已棄用,易受多位元組編碼繞過,勿搭配 magic_quotes_gpc |
mysql_real_escape_string() |
依連線字元集跳脫 SQL 特殊字元 | 舊版 MySQL 擴充套件 | PHP 5.5 棄用,PHP 7.0 移除,請改用 PDO 預處理語句 |
intval() / (int) |
強制轉為整數 | ID、年齡、頁碼等數值參數 | 最簡單有效的類型約束防禦 |
filter_var() |
驗證/過濾變數 | Email、URL、IP、布林值驗證 | 現代 PHP 推薦方式,支援 FILTER_VALIDATE_* / FILTER_SANITIZE_* |
filter_input())$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$stmt->execute([$email, $status]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
str_ireplace(['select','union'], '', $sql))→ 會誤傷正常內容且可繞過addslashes() 防注入 → 多位元組編碼(GBK/Big5)可繞過magic_quotes_gpc=On 時又呼叫 addslashes())→ 資料損壞filter_var($email, FILTER_VALIDATE_EMAIL) 驗證格式htmlspecialchars($str, ENT_QUOTES, 'UTF-8')escapeshellarg() / escapeshellcmd()htmlspecialcharsescapeshellargmagic_quotes_gpc(PHP 5.4+ 已移除)filter_input() 統一取得與驗證輸入session.cookie_httponly=1 防 XSS 竊取 Session安全防護是系統工程,而非單一函式調用。建立分層防禦體系,才能有效降低資安風險。