unserialize serialize online form example ejemplo php serialization portability magic-quotes

serialize - PHP-Solución de presupuestos mágicos más cortos



serialize php ejemplo (3)

No creo que la segunda versión funcione. Las cadenas serializadas se almacenan junto con su longitud; si va a eliminar caracteres, deberá actualizar ese valor de longitud. Prefiero implementarlo de esta manera para mejorar la legibilidad:

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

Estoy escribiendo una aplicación que debe ser portátil. Sé que debo deshabilitar las comillas mágicas en la configuración de PHP, pero en este caso no sé si puedo hacer eso, así que estoy usando el siguiente código:

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

Para simplificar el proceso de deshabilitar comillas mágicas, tuve la siguiente idea:

if (get_magic_quotes_gpc() === 1) { foreach (array(''GET'', ''POST'', ''COOKIE'', ''REQUEST'') as $array) { ${''_''.$array} = unserialize(stripslashes(serialize(${''_''.$array}))); } }

Pero lo intenté y recibí un error que no puedo entender, por ejemplo con ?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";}

Pero unserialize(stripslashes(serialize($_GET))) me da este extraño error:

Aviso: unserialize (): error en el desplazamiento 30 de 32 bytes

EDITAR: Debido al atributo de longitud en serialize() cambié el código para usar funciones JSON:

if (get_magic_quotes_gpc() === 1) { foreach (array(''GET'', ''POST'', ''COOKIE'', ''REQUEST'') as $array) { ${''_'' . $array} = json_decode(stripslashes(json_encode(${''_'' . $array})), true); } }

Sin embargo, ahora que la matriz $_GET está vacía , ¿alguien puede explicarme por qué?


Por lo general, resuelvo ese problema de esta manera:

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

Y luego, por $ _GET:

$_GET = smagic($_GET);


Resuelto, tuve que usar el indicador json_encode() en json_encode() :

if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); }

Antes ( mqgpc.php?name[got''cha]=O''Reilly ):

Array ( [name] => Array ( [got/'cha] => O/'Reilly ) )

Después ( mqgpc.php?name[got''cha]=O''Reilly ):

Array ( [name] => Array ( [got''cha] => O''Reilly ) )