PHP 5.4+ 移除了 magic_quotes_gpc,框架/應用必須自行實現輸入過濾。ECShop 的 addslashes_deep 是經典的遞歸轉義實現,值得移植到自項目中。
<?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);
}
array_map 遞歸調用自身,處理任意深度嵌套數組。addslashes(),保持結構不變。| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| PDO 預處理語句 | 徹底解決 SQL 注入,性能更好 | 需改造所有 DB 查詢 | 新項目、重構項目(強推) |
| 框架中間件/過濾器 | 集中管理、支持多種規則 | 學習成本高 | Laravel/ThinkPHP/Symfony 等 |
| addslashes_deep | 零依賴、兼容舊代碼、改動極小 | 僅防 SQL 注入,不防 XSS;雙重轉義風險 | 老項目維護、快速修補 |
addslashes,再經此函數會導致反斜槓疊加。解決:統一在「入口轉義」或「入庫轉義」二擇一。addslashes 不處理資源類型,文件上傳等場景需單獨處理。