2010-01-17 34 views

Respuesta

68

En una petición HTTP GET, los pares clave/valor se especifican en la URL:

http://server/something?value1=foo&value2=bar.

En una solicitud HTTP POST, pares de clave/valor se envían como parte de la solicitud HTTP después de los encabezados. Por ejemplo:

 
POST /something HTTP/1.1 
Host: server 
Content-Length: 21 
Content-Type: application/x-www-form-urlencoded 

value1=foo&value2=bar 

Es difícil de describir realmente uno como más o menos seguro que el otro, pero los datos HTTP POST no es visible en la URL, y cuando el envío de datos a un sitio web, un HTTP POST general puede solo se realizará como resultado de la interacción del usuario (por ejemplo, haciendo clic en el botón "Enviar").

Esto significa que no se puede engañar a un usuario para que visite una URL como http://server/update_profile?name=I_suck y que los datos confidenciales no se muestren en la URL.

También puede usar nonces y otros tokens antifalsificación con formularios html (que usan POST) para evitar otras formas de falsificaciones de solicitudes entre sitios.

En general, POST debe usarse para solicitudes que potencialmente modifiquen el estado en el servidor, y GET debe usarse para operaciones de solo lectura.

15

No llamaría a POST más o menos seguro que GET. Es cierto que los parámetros se muestran como parte de la URL cuando se utiliza GET, por lo que cualquier dato sensible será inmediatamente visible para el usuario. Sin embargo, es trivial ver e incluso cambiar cualquier parte de la solicitud HTTP, por lo que simplemente porque POST no pasa los datos a través de la URL, todavía se puede leer fácilmente. A menos que esté usando HTTPS, tanto GET como POST transferirán los datos en un formulario de fácil acceso.

+0

¡Buena respuesta! +1 – whiskeysierra

9

El GET method es solo para recuperación de datos y should not have any side-effects. Pero POST está destinado a ese propósito específico: alterar datos en el lado del servidor.

Las solicitudes GET pueden ser fácilmente registradas (ver Cross-Site Request Forgery) simplemente colocando una imagen en una página mientras falsifica solicitudes POST no es tan fácil (esta es también una razón por la que solo debes permitir solicitudes POST autorizadas).

+0

+1 Mencioné esta respuesta en Security.SE aquí: http://security.stackexchange.com/a/12756/396 – LamonteCristo

56

El HTTP specification distingue POST y GET en términos de su intención:

GET es idempotente: es para la obtención de un recurso, sin cambiar nada en el servidor. Como consecuencia, debería ser perfectamente seguro volver a enviar una solicitud GET.

POST no es: sirve para actualizar la información en el servidor. Por lo tanto, no puede suponerse que es seguro volver a enviar la solicitud, razón por la cual la mayoría de los navegadores piden confirmación cuando pulses actualizar en una solicitud POST.

En términos de seguridad, no hay diferencia. POST es más oscuro, tal vez, pero eso es algo muy diferente. La seguridad debe agregarse en otra capa, por ejemplo, SSL.

+1

+1 por ser una respuesta perfectamente simple –

21

Algunas notas sobre peticiones GET:

  1. peticiones GET pueden almacenar en caché
  2. peticiones GET permanecen en el historial del navegador
  3. peticiones GET se pueden marcar
  4. peticiones GET nunca debe ser usado cuando se trata con datos confidenciales
  5. Las solicitudes GET tienen restricciones de longitud
  6. Las solicitudes GET deben usarse solo para re datos trieve

Algunas notas sobre las peticiones POST:

  1. solicitudes POST no se almacenan en caché
  2. solicitudes POST no permanecen en el historial del navegador
  3. solicitudes POST no se pueden marcar
  4. peticiones POST no tiene restricciones en la longitud de datos

(Sour ce: Escuelas W3)

Cuestiones relacionadas