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

PHP 魔術引號 深度解析與最佳實踐

     編輯:PHP 相關知識

什麼是魔術引號?

魔術引號是 PHP 早期為防禦 SQL 注入而引入的自動轉義機制。當 magic_quotes_gpc = On 時,所有 GET、POST、COOKIE 資料的單引號、雙引號、反斜線、NULL 字元會自動加上反斜線轉義(相當於 addslashes())。

三個相關設定

指令影響範圍預設值執行期可改
magic_quotes_gpcHTTP 請求資料(G/P/C)On (PHP 5.3 前)否
magic_quotes_runtime外部資料來源(資料庫、檔案等)Off是 (ini_set)
magic_quotes_sybase單引號轉義方式(單引號雙寫 vs 反斜線)Off是

為什麼已被移除?

  • PHP 5.4 起完全移除:不再支援任何 magic_quotes_* 指令。
  • 移植性差:代碼在不同伺服器設定下行為不一致。
  • 效能浪費:並非所有資料都進資料庫,不必要的轉義增加開銷。
  • 誤導安全感:無法防禦所有注入(如數值型注入、編碼繞過)。

相容舊代碼的處理策略

若維護舊專案需同時支援有/無魔術引號環境,可使用以下函式統一處理:

<?php
function filterInputData($data) {
    if (is_array($data)) {
        return array_map('filterInputData', $data);
    }

    // 若魔術引號開啟,先移除自動加的反斜線
    if (get_magic_quotes_gpc()) {
        $data = stripslashes($data);
    }

    // 統一使用資料庫專用轉義(以 PDO 為例)
    // 實際專案請改用 Prepared Statements,勿手動轉義
    return $data;
}

// 在入口檔案最早處呼叫
$_GET    = filterInputData($_GET);
$_POST   = filterInputData($_POST);
$_COOKIE = filterInputData($_COOKIE);
$_REQUEST = filterInputData($_REQUEST);
?>

現代最佳實踐:Prepared Statements

徹底解決注入問題,不依賴任何轉義設定:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status = :status');
$stmt->execute([':email' => $email, ':status' => 1]);
$user = $stmt->fetch();
?>
  • 參數綁定自動處理型別與轉義
  • SQL 與資料分離,編譯一次多次執行,效能更好
  • 支援所有主流資料庫驅動

總結

魔術引號是歷史產物,現代 PHP 開發應完全關閉並遷移至 Prepared Statements。舊專案若無法立即重構,請在入口統一清理 stripslashes() 並儘快規劃重寫資料存取層。

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