PHP 早期功能:自動對 GET/POST/COOKIE 輸入執行 addslashes() (單引號、雙引號、反斜線、NULL 轉義)。php.ini 三開關:
magic_quotes_gpc = On/Off # 請求資料 magic_quotes_runtime = On/Off # 執行期產生資料 (SQL 結果、exec 等) magic_quotes_sybase = On/Off # 用 '' 代替 \' (Sybase 風格)
stripslashes() 還原,巢狀陣列處理極麻煩<?php
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value) {
return is_array($value)
? array_map('stripslashes_deep', $value)
: stripslashes($value);
}
$_GET = array_map('stripslashes_deep', $_GET);
$_POST = array_map('stripslashes_deep', $_POST);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
放在統一入口檔 (如 bootstrap.php) 最早執行。
| 階段 | 操作 | 函數/方法 |
|---|---|---|
| 輸入驗證 | 白名單過濾、型別檢查 | filter_var, ctype_*, 正則 |
| 資料庫存儲 | 參數化查詢 | PDO::prepare, mysqli_prepare |
| HTML 輸出 | 實體編碼 | htmlspecialchars($str, ENT_QUOTES, 'UTF-8') |
| Shell 命令 | 參數轉義 | escapeshellarg, escapeshellcmd |
| SQL 字串拼接 (極少數) | 驅動專用轉義 | mysqli_real_escape_string, PDO::quote |
; php.ini magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off ; .htaccess (若無法改 php.ini) php_flag magic_quotes_gpc Off php_flag magic_quotes_runtime Off
Magic Quotes 是歷史包袱。現代 PHP 開發:輸入驗證 + 參數化查詢 + 輸出編碼 三部曲,徹底杜絕注入與 XSS,拒絕依賴自動轉義。