HTTP ENVIAR las solicitudes suministran datos adicionales del cliente (navegador) al servidor en el cuerpo del mensaje. A diferencia de, OBTENER las solicitudes incluyen todos los datos requeridos en la URL. Los formularios en HTML pueden usar cualquiera de los dos métodos especificando method = "POST" o method = "GET" (predeterminado) en el elemento. El método especificado determina cómo se envían los datos del formulario al servidor. Cuando el método es GET, todos los datos del formulario se codifican en la URL, anexados a la acción URL como parámetros de cadena de consulta. Con POST, los datos del formulario aparecen dentro del cuerpo del mensaje de la solicitud HTTP.
OBTENER | ENVIAR | |
---|---|---|
Historia | Los parámetros permanecen en el historial del navegador porque son parte de la URL | Los parámetros no se guardan en el historial del navegador. |
Marcado | Se puede marcar como favorito. | No se puede marcar como favorito. |
Botón ATRÁS / comportamiento de reenvío | Las solicitudes GET se vuelven a ejecutar pero no se pueden volver a enviar al servidor si el HTML se almacena en el caché del navegador. | El navegador generalmente alerta al usuario de que los datos deberán volver a enviarse. |
Tipo de codificación (atributo enctype) | aplicación / x-www-form-urlencoded | multipart / form-data o application / x-www-form-urlencoded Use codificación multipart para datos binarios. |
Parámetros | se puede enviar, pero los datos de los parámetros se limitan a lo que podemos incluir en la línea de solicitud (URL). Es más seguro usar menos de 2K de parámetros, algunos servidores manejan hasta 64K | Puede enviar parámetros, incluyendo la carga de archivos, al servidor. |
Hackeado | Más fácil de hackear para los niños script | Más difícil de hackear |
Restricciones en el tipo de datos del formulario | Sí, solo se permiten caracteres ASCII. | Sin restricciones. También se permiten datos binarios.. |
Seguridad | GET es menos seguro en comparación con POST porque los datos enviados son parte de la URL. Así que se guarda en el historial del navegador y los registros del servidor en texto plano. | POST es un poco más seguro que GET porque los parámetros no se almacenan en el historial del navegador o en los registros del servidor web. |
Restricciones en la longitud de los datos del formulario | Sí, ya que los datos del formulario están en la URL y la longitud de la URL está restringida. Un límite de longitud de URL seguro suele ser de 2048 caracteres pero varía según el navegador y el servidor web. | Sin restricciones |
Usabilidad | El método GET no debe utilizarse al enviar contraseñas u otra información confidencial. | Método POST utilizado al enviar contraseñas u otra información confidencial. |
Visibilidad | El método GET es visible para todos (se mostrará en la barra de direcciones del navegador) y tiene límites en la cantidad de información para enviar. | Las variables del método POST no se muestran en la URL. |
En caché | Se puede almacenar en caché | No en caché |
La diferencia fundamental entre MÉTODO = "GET" y MÉTODO = "POST" es que corresponden a diferentes solicitudes HTTP, como se define en las especificaciones HTTP. El proceso de envío para ambos métodos comienza de la misma manera: un conjunto de datos de formulario es construido por el navegador y luego codificado de la manera especificada por el enctype atributo. por METHOD = "POST la enctype atributo puede ser multipart / form-data o aplicación / x-www-form-urlencoded, mientras que para MÉTODO = "GET", solamente aplicación / x-www-form-urlencoded esta permitido. Este conjunto de datos de formulario se transmite al servidor..
Para el envío de formularios con METHOD = "GET", el navegador construye una URL tomando el valor de acción atributo, añadiendo un ? para ello, luego anexando el conjunto de datos del formulario (codificado utilizando el tipo de contenido application / x-www-form-urlencoded). El navegador luego procesa esta URL como si estuviera siguiendo un enlace (o como si el usuario hubiera escrito la URL directamente). El navegador divide la URL en partes y reconoce un host, luego envía a ese host una solicitud GET con el resto de la URL como argumento. El servidor lo lleva desde allí. Tenga en cuenta que este proceso significa que los datos del formulario están restringidos a los códigos ASCII. Se debe tener especial cuidado en codificar y decodificar otros tipos de caracteres al pasarlos a través de la URL en formato ASCII.
El envío de un formulario con METHOD = "POST" hace que se envíe una solicitud POST, utilizando el valor de acción atributo y un mensaje creado de acuerdo con el tipo de contenido especificado por el enctype atributo.
Dado que los datos del formulario se envían como parte de la URL cuando OBTENER es usado --
En principio, el procesamiento de los datos de un formulario enviado depende de si se envía con MÉTODO = "GET" o MÉTODO = "POST". Dado que los datos se codifican de diferentes maneras, se necesitan diferentes mecanismos de decodificación. Por lo tanto, en general, cambiar el MÉTODO puede requerir un cambio en el script que procesa el envío. Por ejemplo, cuando se utiliza la interfaz CGI, el script recibe los datos en una variable de entorno (QUERYSTRING) cuando OBTENER se utiliza Pero cuando ENVIAR se utiliza, los datos del formulario se pasan en el flujo de entrada estándar (stdin) y el número de bytes a leer viene dado por el encabezado Content-length.
Se recomienda GET al enviar formularios "idempotentes", aquellos que no "alteran significativamente el estado del mundo". En otras palabras, formularios que involucran consultas de base de datos solamente. Otra perspectiva es que varias consultas idempotentes tendrán el mismo efecto que una sola consulta. Si hay actualizaciones de la base de datos u otras acciones, como la activación de correos electrónicos, se recomienda el uso de POST.
Desde el blog del desarrollador de Dropbox:
un navegador no sabe exactamente lo que hace un formulario HTML en particular, pero si el formulario se envía a través de HTTP GET, el navegador sabe que es seguro volver a intentar el envío automáticamente si hay un error de red. Para los formularios que utilizan HTTP POST, puede que no sea seguro volver a intentarlo, por lo que el navegador solicita primero al usuario la confirmación..
Una solicitud "GET" a menudo se puede almacenar en caché, mientras que una solicitud "POST" difícilmente puede ser. Para los sistemas de consulta, esto puede tener un impacto considerable en la eficiencia, especialmente si las cadenas de consulta son simples, ya que los cachés pueden servir para las consultas más frecuentes.
En ciertos casos, utilizando ENVIAR Se recomienda incluso para consultas idempotentes:
Actualizado el 15 de mayo de 2015: Específicamente cuando se usa HTTPS (HTTP sobre TLS / SSL), POST ofrece más seguridad que GET?
Esta es una pregunta interesante. Digamos que haces una solicitud GET a una página web:
OBTENGA https://www.example.com/login.php?user=mickey&passwd=mini
Suponiendo que su conexión a Internet está siendo monitoreada, ¿qué información sobre esta solicitud estará disponible para el snooper? Si se usa POST en su lugar, y los datos de usuario y contraseña se incluyen en las variables POST, ¿será más seguro en el caso de las conexiones HTTPS??
La respuesta es no. Si realiza una solicitud GET de este tipo, el atacante solo sabrá la siguiente información que supervisa su tráfico web:
La parte de la ruta de la URL, es decir, la página real solicitada, así como los parámetros de la cadena de consulta, están protegidas (encriptadas) mientras están "sobre el cable", es decir, en tránsito hacia el servidor de destino. La situación es exactamente la misma para las solicitudes POST..
Por supuesto, los servidores web tienden a registrar la URL completa en texto sin formato en sus registros de acceso; por lo tanto, enviar información confidencial a través de GET no es una buena idea. Esto se aplica independientemente de si se utiliza HTTP o HTTPS.