PHP addslashes_deep 递归处理数组注入防护
本文介绍了在PHP中如何手动实现递归版的 addslashes 函数,用于在 get_magic_quotes_gpc 关闭的环境下,对超全局数组进行深度的字符串转义与清洗。
背景与目标
早期 PHP 版本可通过 magic_quotes_gpc 指令自动对 GET、POST 和 COOKIE 数据进行转义。随着该功能被废弃及默认关闭,开发者需在代码层面处理输入数据的转义。若直接遍历数组,无法一次性完成深层嵌套结构或复杂类型的清洗,因此采用递归方法实现 addslashes_deep 成为一种兼容旧逻辑的方案。
第1步:定义递归清洗函数
目的:构建一个能够同时处理标量(字符串)与复合类型(数组)的清洗入口。
核心逻辑:使用 array_map 配合自身回调。当输入值为数组时,递归调用;当为普通字符串时,应用原生 addslashes。
<?php
function addslashes_deep($value)
{
//史上最经典的递归,一行搞定
return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
}
第2步:执行全局数据清洗
目的:判断系统当前是否已开启自动转义保护,若未开启则手动触发清洗。
操作参数:通过 get_magic_quotes_gpc() 返回状态(0 或 1)决定逻辑分支。
//测试数据
$_POST['STR'] = "'fanglor ' is \ a boy >'";
$_GET['STR1'] = 'fanglor " is \ a boy >';
echo '当前get_magic_quotes_gpc为 '.get_magic_quotes_gpc();
echo "<br/>";
//判断当前是否开启get_magic_quotes_gpc
if (!get_magic_quotes_gpc()){
$_POST = addslashes_deep($_POST);
$_GET = addslashes_deep($_GET);
$_COOKIE = addslashes_deep($_COOKIE);
}
//打印结果
var_dump ($_POST);
echo "<br/>";
var_dump ($_GET);
结果与分析
在上述环境中(假设 get_magic_quotes_gpc 为 0),经过 addslashes_deep 处理后,数组中的特殊字符会被追加反斜线转义。
- POST 数据:单引号
'变为\',反斜线本身也进行了转义。 - GET 数据:双引号
"变为\"。
当前get_magic_quotes_gpc为 0
array(1) { ["STR"]=> string(30) "\'fanglor \' is \\ a boy >\'" }
array(1) { ["STR1"]=> string(26) "fanglor \" is \\ a boy >" }
总结
通过递归实现的 addslashes_deep 可以统一化地解决 PHP 5.x 时代遗留的数据清洗问题。虽然现代开发更倾向于使用预处理语句(Prepared Statements)彻底分离 SQL 查询与数据,但理解此机制有助于维护历史系统的兼容性。
以上就是PHP addslashes_deep递归实现利用反斜线引用字符串的详细内容,更多关于PHP addslashes_deep递归利用反斜线引用字符串的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













