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();
優勢:
daddslashes 作為過渡,逐模塊重構數據庫訪問層disable_functions = addslashes 強制團隊遷移(謹慎操作)本封裝解決了「數組輸入轉義」的工程問題,但在現代 PHP 開發中,參數化查詢才是正解。