He estado investigando algunas publicaciones de grupos de noticias sobre PHP Internals y encontré una discusión interesante sobre el tema. El hilo inicial fue sobre otra cosa, pero un comentario de Stefan Esser, un (si no el ) experto en seguridad en el mundo PHP, giró la discusión hacia las implicaciones de seguridad de usar $ _REQUEST para algunas publicaciones.
Citando a Stefan Esser en PHP Internals
$ _REQUEST es una de las mayores debilidades de diseño de PHP. Todas las aplicaciones que utilizan $ _REQUEST son probablemente vulnerables a problemas de falsificación de solicitudes entre sitios retrasados. (Esto básicamente significa que, por ejemplo, si existe una cookie llamada (edad), siempre sobrescribirá el contenido GET / POST y, por lo tanto, se realizarán solicitudes no deseadas)
y en una respuesta posterior al mismo hilo
No se trata del hecho de que alguien pueda falsificar GET, POST; Variables COOKIE. Se trata del hecho de que las COOKIE sobrescribirán los datos GET y POST en REQUEST.
Por lo tanto, podría infectar su navegador con una cookie que diga, por ejemplo, acción = cerrar sesión y a partir de ese día ya no podrá usar la aplicación porque REQUEST [acción] se cerrará para siempre (hasta que elimine manualmente la cookie).
E infectarlo con una COOKIE es tan simple ...
a) Podría usar un vuln XSS en cualquier aplicación en un subdominio
b) ¿Alguna vez intentó configurar una cookie para * .co.uk o * .co.kr cuando tiene un dominio único allí?
c) Otros dominios cruzados de cualquier forma ...
Y si cree que esto no es un problema, puedo decirle que existe una posibilidad simple de configurar fe una cookie * .co.kr que da como resultado que varias versiones de PHP solo devuelvan páginas en blanco. Imagínese: una sola cookie para eliminar todas las páginas PHP en * .co.kr
Y al establecer un ID de sesión ilegal en una cookie válida para * .co.kr en una variable llamada + PHPSESSID = ilegal , aún puede DOS cada aplicación PHP en Corea usando sesiones PHP ...
La discusión continúa para algunas publicaciones más y es interesante de leer.
Como puede ver, el principal problema con $ _REQUEST no es tanto que tenga datos de $ _GET y $ _POST, sino también de $ _COOKIE. Algunos otros chicos de la lista sugirieron cambiar el orden en el que se llena $ _REQUEST, por ejemplo, llenarlo con $ _COOKIE primero, pero esto podría llevar a muchos otros problemas potenciales, por ejemplo, con el manejo de la sesión .
Sin embargo, puede omitir completamente $ _COOKIES del $ _REQUEST global, para que ninguna de las otras matrices lo sobrescriba (de hecho, puede limitarlo a cualquier combinación de sus contenidos estándar, como el manual de PHP en la configuración ini de variable_order Cuéntanos:
variable_order Establece el orden del análisis de la variable EGPCS (Entorno, Obtener, Publicar, Cookie y Servidor). Por ejemplo, si variables_order se establece en "SP", PHP creará las superglobales $ _SERVER y $ _POST, pero no creará $ _ENV, $ _GET y $ _COOKIE. Establecer en "" significa que no se establecerán superglobales.
Pero, de nuevo, también podría considerar no usar $ _REQUEST por completo, simplemente porque en PHP puede acceder a Environment, Get, Post, Cookie y Server en sus propios globales y tener un vector de ataque menos. Aún tiene que desinfectar estos datos, pero es una cosa menos de la que preocuparse.
Ahora puede que se pregunte por qué existe $ _REQUEST después de todo y por qué no se elimina. Esto también se preguntó en PHP Internals. Citando a Rasmus Lerdorf sobre ¿Por qué existe $ _REQUEST? en PHP Internals
Cuantas más cosas como esta eliminemos, más difícil será para las personas pasar rápidamente a versiones más nuevas, más rápidas y más seguras de PHP. Eso causa mucha más frustración para todos que unas pocas funciones heredadas "feas". Si hay una razón técnica, un rendimiento o una seguridad decentes, debemos analizarlo detenidamente. En este caso, lo que deberíamos analizar no es si deberíamos eliminar $ _REQUEST, sino si deberíamos eliminar los datos de las cookies. Muchas configuraciones ya hacen eso, incluida la mía propia, y hay una razón de seguridad válida y sólida para no incluir cookies en $ _REQUEST. La mayoría de la gente usa $ _REQUEST para referirse a GET o POST, sin darse cuenta de que también podría contener cookies y, como tal, los malos podrían potencialmente hacer algunos trucos de inyección de cookies y romper aplicaciones ingenuas.
De todos modos, espero que arroje algo de luz.