php - recorrer - ¿Es seguro llamar a json_decode en la entrada del usuario?
recorrer json php (3)
Estoy almacenando una matriz codificada en JSON de índices enteros => valores enteros en una cookie.
Obviamente, las cookies se pueden manipular fácilmente como cualquier otra entrada del usuario, así que aquí está mi validación de obtención de cookies:
if ($_COOKIE[''myCookie'']) { //if cookie exists
$myCookie = json_decode($_COOKIE[''myCookie''], true);
if (!is_array($myCookie)) { //in case decoding fails or bad cookie
$myCookie = array(); //sets it as empty array
}
} else { //if cookie doesn''t exist, uses an empty array instead
$myCookie = array();
}
Luego, antes de usar cualquiera de los valores, verifico si existe en la matriz y lo comparo con una lista de valores incluidos en la lista blanca. Esta parte parece bastante segura, pero la estoy publicando como parte de la validación:
if (!empty($myCookie[$index])) { //checks if index exists and is truthy
if ($myCookie[$index] !== 1 && $myCookie[$index] !== 2) { //values whitelist
die(''Hacking attempt through cookies exploit.'');
}
//use the cookie data now
}
Volviendo a la pregunta, ¿ es seguro llamar a json_decode
directamente en la cookie? ¿Pueden los usuarios manipular la cookie para ejecutar código arbitrario?
He estado leyendo sobre muchos temas sobre SO hasta ahora y lo que encontré es que unserialize()
está atenuado como inseguro porque llama a constructores, pero json_decode
es técnicamente seguro. He leído a través de sus páginas php.net pero esas no tratan la seguridad directamente.
Mi complemento está llegando a la versión beta en vivo muy pronto, así que me pregunto si llamar a json_decode
directamente en la cookie es lo suficientemente seguro o si debo ejecutar algún tipo de validación antes de llamar a json_decode
. También podría ejecutar un preg_match
, pero como estoy probando contra una lista blanca de valores antes de usarlos, no debería haber ningún problema a menos que json_decode
alguna manera ejecute código arbitrario, lo cual no es así, ¿verdad?
Sé que json_encode
devuelve NULL
si no es JSON válido, pero me pregunto si este es el enfoque correcto o ¿debo agregar algún tipo de validación antes de llamar a json_decode
?
Disculpe si esto es una pregunta demasiado estúpida, solo tengo muy poca experiencia con cookies / JSON y no me gustaría que me culparan por haber eliminado la base de datos de nuestro servidor. Cualquier ayuda / información es apreciada. =]
El uso de json_decode
para decodificar la entrada del usuario directamente no tiene ningún problema de seguridad.
Es solo un análisis de cadena, no hará ninguna evaluación de cadena.
json_decode
en php es como JSON.parse
en javascript, y ambos podrían usarse directamente en la entrada del usuario, están seguros en el momento de la decodificación.
Pero después de ser descodificado, debe validar los datos para su requerimiento.
json_decode fallará si los datos no están en formato json y, de lo contrario, devolverán una buena matriz para que pueda trabajar. Como dijo Itay, si alguien puede explotar esto, casi merece entrar. Json_decode no sufre el riesgo de sql, así que diría que está bien haciendo esto.
Solo asegúrese de limpiar cualquier cosa (o lista blanca, como ya está) antes de incorporarlo en una consulta.
json_decode
que json_decode
está implementado correctamente, debería ser seguro usarlo sin un preprocesamiento adicional (de hecho, podría ser peor, dado que es posible que haya errores en su preprocesador).