Я пишу приложение, которое должно быть портативным. Я знаю, что я должен отключить магические кавычки в конфигурации 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 байт
EDIT: из-за атрибута length в 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
становится пустым , может ли кто-нибудь объяснить мне, почему?
Я не думаю, что вторая версия будет работать. Сериализованные строки сохраняются вместе с их длиной, если вы удаляете символы, вам нужно будет обновить это значение длины. Я бы предпочел реализовать его таким образом, чтобы улучшить читаемость:
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);
с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);
Решив это, я должен был использовать флаг 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 ) )
Обычно я решаю эту проблему следующим образом:
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);