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

PHP 字元安全過濾函式完整指南與最佳實踐

     編輯:PHP 綜合知識

核心原則:永遠不信任使用者輸入

所有來自 $_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_*

防禦策略分層

  1. 輸入端驗證:型別、長度、格式、白名單驗證(如 filter_input())
  2. 業務邏輯層:參數化查詢、ORM 綁定、模板引擎自動跳脫
  3. 輸出端編碼:依輸出語境(HTML/JS/CSS/URL/Shell)套用對應編碼函式

現代最佳實踐:PDO 預處理語句

$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);
  • SQL 與資料分離,根本杜絕注入
  • 自動處理字元集與跳脫
  • 支援重複執行效能優化

常見錯誤模式

  • ❌ 關鍵字黑名單過濾(str_ireplace(['select','union'], '', $sql))→ 會誤傷正常內容且可繞過
  • ❌ 依賴 addslashes() 防注入 → 多位元組編碼(GBK/Big5)可繞過
  • ❌ 雙重跳脫(magic_quotes_gpc=On 時又呼叫 addslashes())→ 資料損壞
  • ✅ 使用 filter_var($email, FILTER_VALIDATE_EMAIL) 驗證格式
  • ✅ 輸出 HTML 時 htmlspecialchars($str, ENT_QUOTES, 'UTF-8')
  • ✅ Shell 指令用 escapeshellarg() / escapeshellcmd()

建議檢查清單

  • [ ] 所有 SQL 使用預處理語句
  • [ ] 所有 HTML 輸出經過 htmlspecialchars
  • [ ] 所有 Shell 參數經過 escapeshellarg
  • [ ] 關閉 magic_quotes_gpc(PHP 5.4+ 已移除)
  • [ ] 使用 filter_input() 統一取得與驗證輸入
  • [ ] 設定 session.cookie_httponly=1 防 XSS 竊取 Session

安全防護是系統工程,而非單一函式調用。建立分層防禦體系,才能有效降低資安風險。

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