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

PHP Magic Quotes 深度解析:為何已被廢棄、如何正確處理輸入資料

     編輯:PHP 綜合知識

什麼是 Magic Quotes?

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 風格)

為何最初引入?

  • 降低初學者門檻,自動防 SQL 注入
  • 快速原型開發便利

為何被廢棄 (PHP 5.4 移除)?

  1. 可移植性差:開啟/關閉行為不一,代碼遷移極易出錯
  2. 效能損耗:所有輸入無差別轉義,大多資料根本不需轉義
  3. 造成困惑:需不斷 stripslashes() 還原,巢狀陣列處理極麻煩
  4. 虛假安全感:僅轉義引號,無法防禦所有注入向量;參數化查詢才是正解

如何檢測與相容處理

<?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

禁用 Magic Quotes 設定

; 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,拒絕依賴自動轉義。

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