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

ECShop 核心安全類庫移植:用戶輸入變量深度轉義 addslashes_deep 實現

     編輯:PHP 相關知識

背景:關閉 magic_quotes_gpc 後的安全責任轉移

PHP 5.4+ 移除了 magic_quotes_gpc,框架/應用必須自行實現輸入過濾。ECShop 的 addslashes_deep 是經典的遞歸轉義實現,值得移植到自項目中。

核心代碼(可直接引入 common.php)

<?php
/* 入口文件統一調用 */
if (!get_magic_quotes_gpc()) {
    if (!empty($_GET))    $_GET    = addslashes_deep($_GET);
    if (!empty($_POST))   $_POST   = addslashes_deep($_POST);
    $_COOKIE = addslashes_deep($_COOKIE);
    $_REQUEST = addslashes_deep($_REQUEST);
}

/**
 * 遞歸轉義:支持多維數組、對象屬性
 * @param mixed $value
 * @return mixed
 */
function addslashes_deep($value) {
    if (empty($value)) return $value;
    if (is_array($value)) {
        return array_map('addslashes_deep', $value);
    }
    return addslashes($value);
}

原理解析

  1. 入口統一:在框架啟動最早期處理超全局變量,確保後續所有邏輯拿到的都是已轉義數據。
  2. 遞歸遍歷:array_map 遞歸調用自身,處理任意深度嵌套數組。
  3. 類型保留:非數組標量值直接 addslashes(),保持結構不變。

現代框架的替代方案對比

方案優點缺點適用場景
PDO 預處理語句徹底解決 SQL 注入,性能更好需改造所有 DB 查詢新項目、重構項目(強推)
框架中間件/過濾器集中管理、支持多種規則學習成本高Laravel/ThinkPHP/Symfony 等
addslashes_deep零依賴、兼容舊代碼、改動極小僅防 SQL 注入,不防 XSS;雙重轉義風險老項目維護、快速修補

避坑指南

  • 雙重轉義:若數據入庫前已手動 addslashes,再經此函數會導致反斜槓疊加。解決:統一在「入口轉義」或「入庫轉義」二擇一。
  • 二進制/資源類型:addslashes 不處理資源類型,文件上傳等場景需單獨處理。
  • 編碼一致性:確保連接層、數據庫、頁面編碼均為 UTF-8,避免多字節字符被誤轉義。

延伸閱讀

  • PHP 變量序列化四大方法對比
  • 根據 Email 域名跳轉郵箱首頁
  • 查看 MySQL 啟動時間與運行時長
  • Slimbox:最輕量級 jQuery 圖片放大插件
  • 強大 PHP 圖片處理類(水印/透明度/縮放/銳化/旋轉/翻轉/剪切/反色)
  • Smarty 模板中使用 PHP 函數及多函數鏈式調用
  • PHP GZip 壓縮 JS/CSS 加速
  • PHP 判斷當前操作系統 Linux/Windows
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved