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

PHP 魔術引號機制詳解:magic_quotes_gpc 與 magic_quotes_runtime 差異與應對策略

     編輯:PHP 綜合知識

PHP 魔術引號歷史包袱與現代應對方案

魔術引號 是 PHP 早期為防 SQL 注入而引入的自動轉義機制,但因副作用大、行為不一致,已於 PHP 5.4 移除。理解其運作差異對維護舊專案、遷移程式碼仍有參考價值。

兩大魔術引號設定比較

設定項目 magic_quotes_gpc magic_quotes_runtime
影響範圍 GET、POST、COOKIE 輸入資料 檔案讀取、exec() 結果、SQL 查詢結果
觸發時機 請求開始 (腳本啟動時) 每次存取執行期產生的資料
轉義字元 ' " \ NULL ' " \ NULL
可在程式中設定 ❌ 無 set_magic_quotes_gpc() ✅ set_magic_quotes_runtime(0|1)
檢測函數 get_magic_quotes_gpc() get_magic_quotes_runtime()
預設值 PHP 5.3 前為 On,後為 Off 預設 Off

相容性處理最佳實踐

由於伺服器設定不一,程式碼必須同時相容 On/Off 兩種情況:

<?php
// 統一處理函數:確保資料只被轉義一次
function safeAddslashes($data) {
    // 遞迴處理陣列
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = safeAddslashes($value);
        }
        return $data;
    }
    
    // 字串處理:若 magic_quotes_gpc 開啟則已轉義,否則手動轉義
    if (!get_magic_quotes_gpc()) {
        return addslashes($data);
    }
    return $data;
}

// 使用範例
$_POST = safeAddslashes($_POST);
$_GET  = safeAddslashes($_GET);
$_COOKIE = safeAddslashes($_COOKIE);

// 處理檔案/資料庫讀取資料 (受 magic_quotes_runtime 影響)
$data = file_get_contents('data.txt');
if (!get_magic_quotes_runtime()) {
    $data = addslashes($data);
}

// 寫入 SQL 後,讀出時需移除反斜線
$result = $pdo->query("SELECT * FROM table");
$row = $result->fetch(PDO::FETCH_ASSOC);
$cleanData = stripslashes($row['field']); // 還原原始資料
?>

關鍵輔助函數總覽

函數 功能 備註
addslashes() 在 ' " \ NULL 前加反斜線 手動轉義
stripslashes() 移除反斜線 讀取資料庫資料還原用
get_magic_quotes_gpc() 回傳 1=開啟, 0=關閉 檢測 GPC 狀態
get_magic_quotes_runtime() 回傳 1=開啟, 0=關閉 檢測 Runtime 狀態
set_magic_quotes_runtime() 設定 Runtime 狀態 建議在程式啟動時設為 0

現代最佳實踐:完全避開魔術引號

✅ 推薦做法 (PHP 5.4+ 已移除魔術引號)

  1. 關閉魔術引號:php.ini 設定 magic_quotes_gpc = Off、magic_quotes_runtime = Off
  2. 使用預處理語句:PDO/MySQLi prepare() + bindParam(),根本不需轉義
  3. 輸出時才跳脫:HTML 用 htmlspecialchars()、JS 用 json_encode()、Shell 用 escapeshellarg()
  4. 移除舊代碼:清理所有 addslashes()/stripslashes()/get_magic_quotes_*() 呼叫

遷移檢查清單

  • ☐ 確認 PHP 版本 ≥ 5.4 (魔術引號已移除)
  • ☐ 搜尋代碼庫:magic_quotes、addslashes、stripslashes
  • ☐ 所有 SQL 查詢改用預處理語句
  • ☐ 所有輸出點套用對應跳脫函數
  • ☐ 測試含特殊字元 (單引號、雙引號、反斜線) 的輸入/輸出
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved