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

PHP 遞歸 addslashes 進階封裝:全自動過濾 GET/POST/COOKIE

     編輯:PHP 相關知識

需求背景

PHP 早期依賴 magic_quotes_gpc 自動轉義輸入,但該特性已於 PHP 5.4 移除。為兼容新舊環境並統一處理多維數組輸入,需封裝一個遞歸轉義函數。

核心實現

<?php
// 關閉運行時魔術引用(不影響輸入階段)
@set_magic_quotes_runtime(0);

// 檢測 magic_quotes_gpc 狀態
$MQG = get_magic_quotes_gpc();

// 僅在未開啟魔術引用時手動處理
if (!$MQG) {
    $_POST = daddslashes($_POST);
    $_GET  = daddslashes($_GET);
    // $_COOKIE = daddslashes($_COOKIE); // 視業務需要啟用
    // $_REQUEST = daddslashes($_REQUEST);
}

/**
 * 遞歸轉義字符串/數組
 * @param mixed $string
 * @return mixed
 */
function daddslashes($string) {
    if (!is_array($string)) {
        return addslashes($string);
    }
    foreach ($string as $key => $val) {
        $string[$key] = daddslashes($val);
    }
    return $string;
}
?>

關鍵點解析

點說明
遞歸遍歷支持多維數組(如 input[name="a[b][c]"])
類型判斷僅對字符串執行 addslashes,數值/布爾/NULL 保持原樣
魔術引用兼容通過 get_magic_quotes_gpc() 避免雙重轉義
性能僅在入口處理一次,後續業務代碼直接使用 $_GET/$_POST

現代替代方案(推薦)

棄用 addslashes,改用預處理語句:

// PDO 示例
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ? AND status = ?');
$stmt->execute([$_GET['email'], 1]);
$user = $stmt->fetch();

優勢:

  • 徹底分離代碼與數據,原理上免疫注入
  • 無需手動轉義,代碼更簡潔
  • 支持參數綁定類型,自動處理編碼

遷移建議

  1. 新項目直接使用 PDO/MySQLi 預處理
  2. 舊項目可保留 daddslashes 作為過渡,逐模塊重構數據庫訪問層
  3. 配合 disable_functions = addslashes 強制團隊遷移(謹慎操作)

本封裝解決了「數組輸入轉義」的工程問題,但在現代 PHP 開發中,參數化查詢才是正解。

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