php - miembros - ¿Qué tan malo es $_REQUEST y cuáles son algunas contramedidas aceptables de Band-Aid?
do they know it''s christmas letra en español (4)
Recientemente me he encontrado con un par de respuestas populares relacionadas con PHP que sugerían usar el superglobal $_REQUEST
, que considero un olor a código, porque me recuerda a register_globals
.
¿Puede proporcionar una buena explicación / evidencia de por qué $_REQUEST
es una mala práctica? Voy a arrojar un par de ejemplos que he desenterrado, y me gustaría más información / perspectiva sobre vectores de ataque teóricos y exploits del mundo real, así como sugerencias de pasos razonables que el administrador de sistemas puede tomar para reducir el riesgo (menos de reescribiendo la aplicación ... o, ¿tenemos que ir a la administración e insistir en una reescritura?).
Vulnerabilidades de ejemplo: el orden de fusión de matriz de GPC
predeterminado significa que los valores de COOKIE anulan GET y POST, por lo que $_REQUEST
se puede usar para ataques XSS y HTTP. PHP permite que las cookies vars sobrescriban las matrices superglobales. Las primeras 10 diapositivas de esta charla dan ejemplos (toda la charla es genial). phpMyAdmin explota un ejemplo de ataque CSRF.
Contramedidas de ejemplo: $_REQUEST
configurar $_REQUEST
array-orden de fusión de GPC
a CGP
para que GET / POST sobrescriba COOKIE, y no al revés. Usa Suhosin para bloquear la sobrescritura de superglobales.
(Además, no me preguntaría si creía que mi pregunta era una tontería, pero felizmente la abrumadora respuesta de SO a "¿Cuándo y por qué se debe usar $ _REQUEST en lugar de $ _GET / $ _POST / $ _COOKIE?" Fue "Nunca". )
$ _REQUEST es un mal como $ _GET, $ _POST y $ _COOKIE. Si bien creo que hay escenarios válidos para usar $ _REQUEST pero hay una buena razón para no usar $ _REQUEST y etiquetarlo como "mala práctica".
La razón principal al usar $ _REQUEST es que el parámetro puede ser transferido en $ _POST o $ _GET. Al acceder a $ _REQUEST no tiene que comprobar $ _GET y $ _POST si el valor está establecido. El problema es que la configuración ini gpc_order puede cambiar el comportamiento de cómo se construye $ _REQUEST. Esta configuración puede variar de un servidor a otro y su script puede cambiar el comportamiento.
Es vulnerable a todo lo que pasa en la URL. Por lo tanto, si un formulario contiene un campo oculto con el "ID de usuario" que se envió con el formulario, aunque en teoría el usuario no puede editarlo, no hay nada que lo detenga, cambie el valor si es lo suficientemente claro.
Si solo desea obtener el valor de la solicitud, está bien, pero debe tener en cuenta que puede ser falso, por lo que debe actuar en consecuencia y, desde luego, no utilizarlo para datos seguros de parámetros / valores.
$_REQUEST
es problemático porque ignora la diferencia entre URL ( $_GET
) y cuerpo de solicitud ( $_POST
). Una solicitud HTTP-GET no debe tener efectos secundarios, mientras que un HTTP-POST puede tener efectos secundarios y, por lo tanto, no se puede almacenar en caché. Al lanzar estas fuentes de datos completamente diferentes en un solo segmento, se requieren aplicaciones que no sean REST -ful, es decir, malas aplicaciones.
Simplemente trátelo tal como es: un método para obtener datos del usuario. Tiene que ser sanitizado y validado, entonces, ¿por qué te importa si se trata de un POST, un GET o una cookie? Todos provienen del usuario, por lo que dicen ''¡pueden ser engañados!'' es superfluo