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

PHP 魔術引號帶來的 SQL 注入風險深度分析

     編輯:PHP 相關知識

魔術引號機制缺陷與繞過漏洞剖析

PHP 魔術引號(Magic Quotes GPC)自動為 GPC 數據添加反斜杠,但實現邏輯缺陷可導致嚴重安全隱患。

漏洞成因代碼還原

<?php
function daddslashes($string, $force = 0) {
    !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
    if (!MAGIC_QUOTES_GPC || $force) {
        if (is_array($string)) {
            foreach ($string as $key => $val) {
                $string[$key] = daddslashes($val, $force);
            }
        } else {
            $string = addslashes($string);
        }
    }
    return $string;
}

// 註冊全局變量(極度危險的老式寫法)
foreach (array('_COOKIE', '_POST', '_GET') as $_request) {
    foreach ($$_request as $_key => $_value) {
        if ($_key{0} != '_') $$_key = daddslashes($_value);
    }
}

// 漏洞觸發點
echo $xigr['hi'];  // 預期數組,實際可被字符串覆蓋

攻擊向量構造

  1. 提交 ?xigr='ryat,經處理變為 \'ryat(字符串)
  2. 後續代碼 $xigr['hi'] 將字符串當數組訪問,PHP 取首字符 \
  3. 若此值拼入 SQL:... WHERE uid IN ('" . implode("','", $uids) . "')
  4. 構造 ?xigr[]='&xigr[][uid]=evilcode 繞過 GPC 保護,實現 SQL 注入

核心風險點

  • 類型不固定:變量未強類型約束,字符串可偽裝數組
  • 雙重轉義:GPC 開啟時 addslashes() 導致反斜杠疊加
  • 註冊全局變量:register_globals 風格代碼極易被覆蓋任意變量

修復建議

  1. 禁用魔術引號:PHP 5.4+ 已移除,舊版設置 magic_quotes_gpc = Off
  2. 統一入口過濾:框架層統一處理,避免業務代碼重複/遺漏
  3. 參數化查詢:PDO/MySQLi 預處理語句徹底解決注入
  4. 類型強制:is_array() 校驗後再按數組處理

現代框架(Laravel、ThinkPHP 等)均已內建完善的輸入處理機制,切勿在項目中手動實現魔術引號邏輯。

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