Magic Quotes 是 PHP 早期為初學者提供的自動轉義機制:當開啟時,所有 $_GET、$_POST、$_COOKIE 資料中的單引號 '、雙引號 "、反斜線 \、NULL 字元會自動加上反斜線轉義(等同 addslashes())。
| 指令 | 影響範圍 | 可否運行時修改 | 預設值 |
|---|---|---|---|
| magic_quotes_gpc | HTTP 請求資料 (GET/POST/COOKIE) | 否 | On |
| magic_quotes_runtime | 外部資料來源(資料庫、檔案、exec()) | 是 | Off |
| magic_quotes_sybase | 單引號用單引號轉義而非反斜線,覆蓋 gpc | 否 | Off |
get_magic_quotes_gpc() 檢測stripslashes()php.ini-recommended 建議關閉,主因為效能考量。
| 情境 | gpc | addslashes | SQL 執行 | 資料庫儲存 | 輸出結果 |
|---|---|---|---|---|---|
| 1 | Off | 無 | 失敗 | 無 | 無 |
| 2 | Off | 有 | 成功 | snow''''sun | snow''''sun |
| 3 | On | 無 | 成功 | snow''''sun | snow''''sun |
| 4 | On | 有 | 成功 | snow\'\'\'\'sun | snow\'\'\'\'sun |
addslashes() 的反斜線不會寫入資料庫,僅協助 SQL 執行;資料庫儲存的是原始字元addslashes(),否則會造成雙重轉義(反斜線寫入資料庫)addslashes() 或更好:使用 Prepared Statementsif (get_magic_quotes_gpc()) {
function stripslashes_deep($value) {
return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
}
$_GET = stripslashes_deep($_GET);
$_POST = stripslashes_deep($_POST);
$_COOKIE = stripslashes_deep($_COOKIE);
}
影響 fread()、exec()、資料庫查詢結果等執行期間產生的資料,預設 Off,建議保持關閉。