PHP – Сокращение магических предложений

Я пишу приложение, которое должно быть портативным. Я знаю, что я должен отключить магические кавычки в конфигурации 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 становится пустым , может ли кто-нибудь объяснить мне, почему?

Related of "PHP – Сокращение магических предложений"

Я не думаю, что вторая версия будет работать. Сериализованные строки сохраняются вместе с их длиной, если вы удаляете символы, вам нужно будет обновить это значение длины. Я бы предпочел реализовать его таким образом, чтобы улучшить читаемость:

 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);