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

PHP 魔術引號(Magic Quotes)歷史遺留問題與反斜槓處理最佳實踐

     編輯:PHP 綜合知識

背景知識

magic_quotes_gpc 是 PHP 早期(< 5.4)為防 SQL 注入自動對 $_GET/POST/COOKIE 添加反斜槓轉義的功能。已於 PHP 5.4 移除,現代代碼不應依賴它。

常見症狀與誤區

  • 輸出內容出現多餘反斜槓(如 It\'s)。
  • 使用 stripslashes() 後,在關閉 magic_quotes 的環境誤刪正常反斜槓(如 Windows 路徑 C:\path)。

兼容性處理方案(按推薦順序)

方案一:php.ini 關閉(根治,需服務器權限)

magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off

方案二:.htaccess 關閉(Apache,需 AllowOverride)

php_flag magic_quotes_gpc Off

方案三:代碼層統一清洗(移植性最強,無需服務器配置)


// 入口文件最早處執行
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    $strip = function ($v) use (&$strip) {
        return is_array($v) ? array_map($strip, $v) : stripslashes($v);
    };
    $_GET    = array_map($strip, $_GET);
    $_POST   = array_map($strip, $_POST);
    $_COOKIE = array_map($strip, $_COOKIE);
    $_REQUEST= array_map($strip, $_REQUEST);
}

原理:遞歸處理多維數組,僅在 magic_quotes 開啟時執行,PHP 5.4+ get_magic_quotes_gpc 恒返回 false,代碼自動失效,零侵入。

現代最佳實踐:拒絕魔術,拥抱預處理

  1. 數據庫操作:只用 PDO/MySQLi 預處理語句,參數綁定自動處理轉義,根治 SQL 注入。
  2. 輸出編碼:HTML 上下文用 htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),JS 上下文用 json_encode(),URL 用 urlencode()。
  3. 輸入驗證:白名單驗證格式(如郵箱、手機號),而非依賴轉義。

總結

Magic Quotes 是設計失誤,已被棄用移除。現代代碼應在入口統一清洗歷史殘留,核心防護靠預處理語句與上下文輸出編碼。

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