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

PHP 轉義機制完整指南:magic_quotes、addslashes、htmlspecialchars、資料庫防注入

     編輯:PHP 相關知識

歷史遺產:Magic Quotes (PHP 5.4 移除)

指令作用範圍觸發時機狀態
magic_quotes_gpcGET/POST/COOKIE請求開始 (RINIT)已移除
magic_quotes_runtimefile_get_contents、exec、SQL 查詢結果執行時已移除
magic_quotes_sybase用 '' 代替 \' 轉義同 gpc已移除

核心問題:全域自動轉義導致雙重轉義、資料污染、可移植性差。現代 PHP 禁止使用,需在程式碼層面顯式處理。

核心轉義函數對照

函數用途轉義字符逆向函數適用場景
addslashes()字串通用轉義' " \ NULstripslashes()非資料庫字串處理
htmlspecialchars()HTML 實體編碼& < > " ' (ENT_QUOTES)htmlspecialchars_decode()輸出到 HTML 頁面
htmlentities()所有可轉實體字符含國際字符html_entity_decode()完整 HTML 實體化
mysqli_real_escape_string()MySQL 字串轉義依連線字符集無舊式 SQL 拼接 (不推薦)
PDO::quote()PDO 通用轉義依驅動無PDO 拼接 (不推薦)

現代最佳實踐:預備語句 (Prepared Statements)

// 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);

// 參數綁定類型控制
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->bindValue(':name', $name, PDO::PARAM_STR);

輸出端防 XSS:語境感知編碼

$input = '';

// HTML 內文
echo htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
// 輸出:<script>alert(1)</script>

// HTML 屬性值
echo '';

// JavaScript 字串
echo '';
// json_encode 自動處理 JS 字串轉義

// URL 參數
echo 'link';

// CSS 值 (需專用庫)
echo '
';

資料流向轉義策略

  1. 輸入驗證:型別、長度、格式、白名單 (非轉義)
  2. 儲存層:預備語句參數化,完全隔離代碼與數據
  3. 業務邏輯:保持原始數據,不做轉義
  4. 輸出層:根據輸出語境 (HTML/JS/URL/CSS) 做語境編碼

常見錯誤模式

  • ❌ 入庫前 addslashes,輸出時 htmlspecialchars → 雙重轉義
  • ❌ 信任 magic_quotes_gpc 自動處理
  • ❌ 直接拼接 SQL:"WHERE name = '$name'"
  • ❌ 輸出 JS 時用 htmlspecialchars 而非 json_encode
  • ✅ 統一使用 PDO 預備語句 + 輸出時語境編碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved