我正在编写一个需要移植的应用程序。我知道我应该在PHP配置上禁用魔术引号但在这种情况下我不知道我是否可以这样做,所以我使用以下代码:
if (get_magic_quotes_gpc() === 1)
{
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process))
{
foreach ($val as $k => $v)
{
unset($process[$key][$k]);
if (is_array($v))
{
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
}
else
{
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
为了简化禁用魔术引号的过程,我有以下想法:
if (get_magic_quotes_gpc() === 1)
{
foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array)
{
${'_'.$array} = unserialize(stripslashes(serialize(${'_'.$array})));
}
}
但是我尝试了,但是我收到了一个我无法理解的错误,例如?name=O'Reilly
:
serialize($_GET); // a:1:{s:4:"name";s:9:"O\'Reilly";}
stripslashes(serialize($_GET)); // a:1:{s:4:"name";s:9:"O'Reilly";}
但是 unserialize(stripslashes(serialize($_GET)))
给了我这个奇怪的错误:
注意:unserialize():偏移量为30的32字节错误
编辑:由于serialize()
中的长度属性,我更改了代码以使用JSON函数:
if (get_magic_quotes_gpc() === 1)
{
foreach (array('GET', 'POST', 'COOKIE', 'REQUEST') as $array)
{
${'_' . $array} = json_decode(stripslashes(json_encode(${'_' . $array})), true);
}
}
但现在 $_GET
阵列空无一人,有人可以解释一下原因吗?
答案 0 :(得分:2)
我不认为第二个版本会起作用。序列化字符串与它们的长度一起存储,如果要删除字符,则需要更新该长度值。我宁愿以这种方式实现它以提高可读性:
function strip_slashes_recursive(&$value) {
if (!is_array($value)) {
$value = strip_slashes($value);
} else {
foreach (array_keys($value) as $key) {
$arrayValue = strip_slashes_recursive($value[$key]);
unset($value[$key]);
$value[strip_slashes($key)] = $arrayValue;
}
}
}
foreach (array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST) as &$array) {
strip_slashes_recursive($array);
}
// don't forget to unset references or it can lead to very nasty bugs
unset($array);
答案 1 :(得分:1)
解决了这个问题,我必须使用JSON_HEX_APOS
中的json_encode()
标记:
if (get_magic_quotes_gpc() === 1)
{
$_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
}
之前(mqgpc.php?name[got'cha]=O'Reilly
):
Array
(
[name] => Array
(
[got\'cha] => O\'Reilly
)
)
之后(mqgpc.php?name[got'cha]=O'Reilly
):
Array
(
[name] => Array
(
[got'cha] => O'Reilly
)
)
答案 2 :(得分:0)
我通常以这种方式解决这个问题:
function smagic($params){
if(get_magic_quotes_gpc()){
if(!is_array($params))
return stripslashes($params);
else
return array_combine( array_map('stripslashes',array_keys($params)), array_map('smagic',array_values($params)) );
}
}
然后,对于$ _GET:
$_GET = smagic($_GET);