La solicitud GET es marginalmente menos segura que la solicitud POST. Ninguno de los dos ofrece verdadera "seguridad" por sí mismo; El uso de solicitudes POST no hará que su sitio web sea mágicamente seguro contra ataques maliciosos por una cantidad notable. Sin embargo, el uso de solicitudes GET puede hacer que una aplicación segura sea insegura.
El mantra de que "no debe utilizar las solicitudes GET para realizar cambios" sigue siendo muy válido, pero esto tiene poco que ver con el comportamiento malicioso . Los formularios de inicio de sesión son los más sensibles a ser enviados usando el tipo de solicitud incorrecto.
Buscar arañas y aceleradores web
Esta es la verdadera razón por la que debe usar las solicitudes POST para cambiar los datos. Las arañas de búsqueda seguirán cada enlace en su sitio web, pero no enviarán formularios aleatorios que encuentren.
Los aceleradores web son peores que las arañas de búsqueda, porque se ejecutan en la máquina del cliente y "hacen clic" en todos los enlaces en el contexto del usuario conectado . Por lo tanto, una aplicación que utiliza una solicitud GET para eliminar cosas, incluso si requiere un administrador, felizmente obedecerá las órdenes del acelerador web (¡no malicioso!) Y eliminará todo lo que vea .
Adjunto de ataque confuso
Es posible un ataque adjunto confuso (donde el adjunto es el navegador), independientemente de si utiliza una solicitud GET o POST .
En los sitios web controlados por atacantes, GET y POST son igualmente fáciles de enviar sin interacción del usuario .
El único escenario en el que POST es ligeramente menos susceptible es que muchos sitios web que no están bajo el control del atacante (por ejemplo, un foro de terceros) permiten incrustar imágenes arbitrarias (permitiendo que el atacante inyecte una solicitud GET arbitraria), pero evitan formas de inyectar una solicitud POST arbitraria, ya sea automática o manual.
Se podría argumentar que los aceleradores web son un ejemplo de ataque adjunto confuso, pero eso es solo una cuestión de definición. En todo caso, un atacante malintencionado no tiene control sobre esto, por lo que apenas es un ataque , incluso si el oficial está confundido.
Registros proxy
Es probable que los servidores proxy registren las URL GET en su totalidad, sin quitar la cadena de consulta. Los parámetros de solicitud POST normalmente no se registran. Es poco probable que las cookies se registren en cualquier caso. (ejemplo)
Este es un argumento muy débil a favor de POST. En primer lugar, el tráfico no cifrado se puede registrar en su totalidad; Un proxy malicioso ya tiene todo lo que necesita. En segundo lugar, los parámetros de solicitud son de uso limitado para un atacante: lo que realmente necesitan son las cookies, por lo que si lo único que tienen son registros proxy, es poco probable que puedan atacar una URL GET o POST.
Hay una excepción para las solicitudes de inicio de sesión: tienden a contener la contraseña del usuario. Guardar esto en el registro de proxy abre un vector de ataque que está ausente en el caso de POST. Sin embargo, el inicio de sesión a través de HTTP simple es inherentemente inseguro de todos modos.
Caché proxy
Los servidores proxy de almacenamiento en caché pueden retener las respuestas GET, pero no las respuestas POST. Dicho esto, las respuestas GET pueden hacerse no almacenables en caché con menos esfuerzo que convertir la URL en un controlador POST.
HTTP "Referer"
Si el usuario navegara a un sitio web de un tercero desde la página servida en respuesta a una solicitud GET, ese sitio web de terceros podrá ver todos los parámetros de la solicitud GET.
Pertenece a la categoría de "revela parámetros de solicitud a un tercero", cuya gravedad depende de lo que esté presente en esos parámetros. Las solicitudes POST son naturalmente inmunes a esto, sin embargo, para explotar la solicitud GET, un hacker necesitaría insertar un enlace a su propio sitio web en la respuesta del servidor.
Historial del navegador
Esto es muy similar al argumento "registros de proxy": las solicitudes GET se almacenan en el historial del navegador junto con sus parámetros. El atacante puede obtenerlos fácilmente si tiene acceso físico a la máquina.
Acción de actualización del navegador
El navegador volverá a intentar una solicitud GET tan pronto como el usuario presione "actualizar". Podría hacer eso al restaurar pestañas después del apagado. Cualquier acción (por ejemplo, un pago) se repetirá sin previo aviso.
El navegador no volverá a intentar una solicitud POST sin una advertencia.
Esta es una buena razón para usar solo solicitudes POST para cambiar datos, pero no tiene nada que ver con el comportamiento malicioso y, por lo tanto, con la seguridad.
¿Entonces qué debo hacer?
- Use solo solicitudes POST para cambiar datos, principalmente por razones no relacionadas con la seguridad.
- Utilice solo solicitudes POST para formularios de inicio de sesión; hacer lo contrario introduce vectores de ataque.
- Si su sitio realiza operaciones delicadas, realmente necesita a alguien que sepa lo que está haciendo, porque esto no se puede cubrir en una sola respuesta. Debe usar HTTPS, HSTS, CSP, mitigar la inyección de SQL, la inyección de scripts (XSS) , CSRF y una gran cantidad de otras cosas que pueden ser específicas para su plataforma (como la vulnerabilidad de asignación masiva en varios marcos: ASP.NET MVC , Ruby on Rails , etc.). No hay una sola cosa que haga la diferencia entre "seguro" (no explotable) y "no seguro".
A través de HTTPS, los datos de POST están codificados, pero ¿podrían ser rastreados los URL por un tercero?
No, no se pueden oler. Pero las URL se almacenarán en el historial del navegador.
¿Sería justo decir que la mejor práctica es evitar la posibilidad de colocar datos confidenciales en el POST o GET por completo y usar el código del lado del servidor para manejar la información confidencial?
Depende de qué tan sensible sea, o más específicamente, de qué manera. Obviamente el cliente lo verá. Cualquier persona con acceso físico a la computadora del cliente lo verá. El cliente puede falsificarlo cuando se lo devuelva. Si eso es importante, sí, mantenga los datos confidenciales en el servidor y no deje que se vayan.