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

PHP magic_quotes_gpc 深度解析與最佳實務

     編輯:PHP 綜合知識

什麼是 Magic Quotes?

Magic Quotes 是 PHP 早期為初學者提供的自動轉義機制:當開啟時,所有 $_GET、$_POST、$_COOKIE 資料中的單引號 '、雙引號 "、反斜線 \、NULL 字元會自動加上反斜線轉義(等同 addslashes())。

三個相關指令

指令影響範圍可否運行時修改預設值
magic_quotes_gpcHTTP 請求資料 (GET/POST/COOKIE)否On
magic_quotes_runtime外部資料來源(資料庫、檔案、exec())是Off
magic_quotes_sybase單引號用單引號轉義而非反斜線,覆蓋 gpc否Off

為什麼不建議使用?

  1. 可攜性差:假設開啟或關閉會影響程式移植,需用 get_magic_quotes_gpc() 檢測
  2. 效能損耗:並非所有資料都進資料庫,自動轉義所有輸入浪費資源
  3. 不便性:不需轉義的資料(如郵件內容)也會被加上反斜線,需額外 stripslashes()

php.ini-recommended 建議關閉,主因為效能考量。

實測情境分析(資料:snow''''sun)

情境gpcaddslashesSQL 執行資料庫儲存輸出結果
1Off無失敗無無
2Off有成功snow''''sunsnow''''sun
3On無成功snow''''sunsnow''''sun
4On有成功snow\'\'\'\'sunsnow\'\'\'\'sun

關鍵結論

  • addslashes() 的反斜線不會寫入資料庫,僅協助 SQL 執行;資料庫儲存的是原始字元
  • gpc=On 時,不要再呼叫 addslashes(),否則會造成雙重轉義(反斜線寫入資料庫)
  • gpc=Off 時,必須對入庫資料用 addslashes() 或更好:使用 Prepared Statements

最佳實務建議

  1. 關閉 magic_quotes_gpc(PHP 5.4+ 已移除此功能)
  2. 使用 PDO / MySQLi Prepared Statements 參數綁定,徹底避免 SQL Injection
  3. 若維護舊專案,入口檔案統一處理:
    if (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);
    }
    

補充:magic_quotes_runtime

影響 fread()、exec()、資料庫查詢結果等執行期間產生的資料,預設 Off,建議保持關閉。

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