¿Cuándo debo usar el método GET o POST? ¿Cual es la diferencia entre ellos?

249

¿Cuál es la diferencia al usar GETo POSTmétodo? ¿Cuál es más seguro? ¿Cuáles son las (des) ventajas de cada uno de ellos?

( pregunta similar )

Adriana
fuente
2
Get no tiene un cuerpo, por lo que en la práctica significa que está limitado a pares de nombre -> valor como estructura de datos debido a la falta de cualquier formato de codificación de cadena de consulta para una estructura más compleja. Si necesita manejar estructuras de datos más complejas en sus solicitudes (es decir, una matriz, objeto, etc.), debe usar POST y quizás formatos más avanzados (json / xml). Dicho brevemente: no use GET a menos que realmente tenga que hacerlo (es decir, la URL / recurso debe ser reconocible).
themihai
1
Posible duplicado de ¿ Cuándo usa POST y cuándo usa GET?
Imran Ali Khan

Respuestas:

263

No es una cuestión de seguridad. El protocolo HTTP define las solicitudes de tipo GET como idempotentes , mientras que las POST pueden tener efectos secundarios. En inglés simple, eso significa que GET se usa para ver algo, sin cambiarlo, mientras que POST se usa para cambiar algo. Por ejemplo, una página de búsqueda debe usar GET, mientras que un formulario que cambia su contraseña debe usar POST.

Además, tenga en cuenta que PHP confunde un poco los conceptos. Una solicitud POST obtiene entrada de la cadena de consulta y a través del cuerpo de la solicitud. Una solicitud GET solo recibe información de la cadena de consulta. Entonces, una solicitud POST es un superconjunto de una solicitud GET; puede usar $_GETen una solicitud POST, e incluso puede tener sentido tener parámetros con el mismo nombre $_POSTy $_GETque signifiquen cosas diferentes.

Por ejemplo, supongamos que tiene un formulario para editar un artículo. El ID del artículo puede estar en la cadena de consulta (y, por lo tanto, disponible a través de $_GET['id']), pero supongamos que desea cambiar el ID del artículo. El nuevo ID puede estar presente en el cuerpo de la solicitud ( $_POST['id']). De acuerdo, tal vez ese no sea el mejor ejemplo, pero espero que ilustre la diferencia entre los dos.

Troelskn
fuente
13
Definitivamente, hay un aspecto de seguridad en la diferencia entre GET y POST. Un sitio malicioso puede pegar una solicitud GET arbitraria en una etiqueta de imagen, por ejemplo, haciendo que los usuarios hagan un GET contra otro servidor. Si este GET es como la cuenta del servidor / delegado, entonces suceden cosas malas.
Frank Schwieterman
2
Lo que quise decir es que el contenido de $ _POST no está mágicamente oculto a los usuarios malintencionados. Obviamente, hay aspectos de seguridad en toda la programación de cosas.
troelskn 02 de
1
Esta publicación no responde la pregunta por completo porque no menciona las implicaciones de seguridad. La parte superior es buena siempre que el error de ortografía "pain English" se cambie a "simple English". La parte inferior es demasiado difícil de seguir. En general, mucho mejor que mi post aunque. :-)
Akrikos 03 de
1
"Una solicitud POST obtiene entrada de la cadena de consulta y a través del cuerpo de la solicitud". En mi humilde opinión esto es incorrecto. Para usar cualquier entrada, debe usar $ _REQUEST. $ _POST no obtiene las entradas de URL.
Gunnar Bernstein
1
@ Frank Schwieterman Sé que esta publicación es antigua, pero eliminar mi cuenta no es idempotente y no debería usar get.
frostymarvelous
77

Cuando el usuario ingresa información en un formulario y hace clic en Enviar, hay dos formas en que la información se puede enviar desde el navegador al servidor: en la URL o dentro del cuerpo de la solicitud HTTP.

El método GET, que se utilizó en el ejemplo anterior, agrega pares de nombre / valor a la URL. Desafortunadamente, la longitud de una URL es limitada, por lo que este método solo funciona si solo hay unos pocos parámetros. La URL podría truncarse si el formulario usa una gran cantidad de parámetros, o si los parámetros contienen grandes cantidades de datos. Además, los parámetros pasados ​​en la URL son visibles en el campo de dirección del navegador, no el mejor lugar para mostrar una contraseña.

La alternativa al método GET es el método POST. Este método empaqueta los pares de nombre / valor dentro del cuerpo de la solicitud HTTP, lo que lo convierte en una URL más limpia y no impone limitaciones de tamaño en la salida de los formularios. También es más seguro.

Adaptador IA
fuente
1
¿Cómo es más "seguro"?
Julian Reschke
44
porque es más difícil de cambiar? puedes cambiar GET en la barra de direcciones, pero no es tan fácil con POST.
IAdapter
8
El servidor no puede confiar en el cliente. Diseñar su aplicación alrededor de suposiciones falsas está lejos de ser seguro.
troelskn
openid tampoco se guarda, porque se puede romper?
IAdapter
1
Creo que esta es la explicación más clara: la diferencia sobre la ubicación de los datos enviados. Gracias.
greenoldman
37

La mejor respuesta fue la primera.

Tu estas usando:

  • OBTENGA cuando desee recuperar datos (OBTENER DATOS).
  • POST cuando quiera enviar datos (POST DATA).
alex
fuente
2
¿Qué patrón de servicio de solicitud / respuesta se usa y desea hacer ambas cosas? ;) Preferiría usar POST en la mayoría de los casos cuando necesito una respuesta.
Dmitry Pavlov
8
En general eso es cierto. GETtambién es perfectamente capaz de "enviar" datos, por lo que no es una respuesta muy precisa.
Patrick Hofman
23

Hay dos implicaciones comunes de "seguridad" para el uso GET. Dado que los datos aparecen en la cadena de URL, es posible que alguien que mira por encima de su hombro en la Barra de direcciones / URL pueda ver algo de lo que no debería estar al tanto, como una cookie de sesión que podría usarse para secuestrar su sesión. Tenga en cuenta que todos tienen teléfonos con cámara.

La otra implicación de seguridad GETtiene que ver con las GETvariables que se registran en el registro de acceso de la mayoría de los servidores web como parte de la URL solicitante. Dependiendo de la situación, el clima regulatorio y la sensibilidad general de los datos, esto puede generar preocupaciones.

Algunos clientes / cortafuegos / sistemas IDS pueden desaprobar las GETsolicitudes que contienen una cantidad excesiva de datos y, por lo tanto, pueden proporcionar resultados poco confiables.

POST admite funcionalidades avanzadas, como la compatibilidad con entradas binarias de varias partes utilizadas para la carga de archivos en servidores web.

POSTrequiere un encabezado de longitud de contenido que pueda aumentar la complejidad de la implementación de un cliente específico de la aplicación, ya que el tamaño de los datos enviados debe conocerse de antemano para evitar que se forme una solicitud de cliente en un modo incremental exclusivo de paso único. Quizás un problema menor para aquellos que eligen abusar HTTPal usarlo como un transporte RPC (Llamada a procedimiento remoto).

Otros ya han hecho un buen trabajo al cubrir las diferencias semánticas y el "cuándo" de esta pregunta.

Einstein
fuente
17

Utilizo GET cuando recupero información de una URL y POST cuando envío información a una URL.

Mark Biek
fuente
1
pero también puedes usar GET para enviar. La diferencia es el formato (en la url (GET) o en la solicitud (POST)).
eric
Si el punto final acepta un archivo y devuelve una línea desde el archivo (no hay creación o cambio de datos o la base de datos está involucrada), entonces ¿el punto final debe ser GET o POST?
variable
17

Debería usar POST si hay muchos datos o algún tipo de información confidencial (las cosas realmente sensibles también necesitan una conexión segura).

Use GET si desea que las personas puedan marcar su página, ya que todos los datos se incluyen con el marcador.

Solo tenga cuidado con las personas que presionan REFRESH con el método GET, porque los datos se enviarán nuevamente cada vez sin avisar al usuario (POST a veces advierte al usuario sobre el reenvío de datos).

Conceder
fuente
Si el punto final acepta un archivo y devuelve una línea desde el archivo (no hay creación o cambio de datos o la base de datos está involucrada), entonces ¿el punto final debe ser GET o POST?
variable
@ POST variable. En este caso, principalmente porque POST está diseñado para manejar cargas de archivos y GET estándar no lo es. Tendría que enviar el archivo cada vez que se carga la página, por lo que tiene sentido usar POST estándar en lugar del archivo GET +, lo que rompería las expectativas de GET de que una URL debería dar más o menos los mismos resultados cada vez.
Grant
14

Este documento del W3C explica el uso de HTTP GET y POST.

Creo que es una fuente autorizada.

El resumen es (sección 1.3 del documento):

  • Use GET si la interacción se parece más a una pregunta (es decir, es una operación segura, como una consulta, una operación de lectura o una búsqueda).
  • Use POST si:
    • La interacción es más como una orden, o
    • La interacción cambia el estado del recurso de manera que el usuario lo perciba (por ejemplo, una suscripción a un servicio), o
    • El usuario será responsable de los resultados de la interacción.
chus
fuente
99
Creo que eso se puede resumir así: GET cuando el estado del servidor no cambia, POST cuando lo está.
Yamcha
10

Los métodos Get y Post no tienen nada que ver con la tecnología de servidor que está utilizando, funciona igual en php, asp.net o ruby. GET y POST son parte del protocolo HTTP. Como señaló Mark, POST es más seguro. Los formularios POST tampoco son almacenados en caché por el navegador. POST también se utiliza para transferir grandes cantidades de datos.

culebra
fuente
8

La razón para usar POST al realizar cambios en los datos:

  • Un acelerador web como Google Web Accelerator hará clic en todos los enlaces (GET) de una página y los almacenará en caché. Esto es muy malo si los enlaces hacen cambios a las cosas.
  • Un navegador almacena en caché las solicitudes GET, por lo que incluso si el usuario hace clic en el enlace, es posible que no envíe una solicitud al servidor para ejecutar el cambio.
  • Para proteger su sitio / aplicación contra CSRF debe usar POST. Para proteger completamente su aplicación, también debe generar un identificador único en el servidor y enviarlo junto con la solicitud.

Además, no coloque información confidencial en la cadena de consulta (única opción con GET) porque aparece en la barra de direcciones, marcadores y registros del servidor.

Esperemos que esto explique por qué la gente dice que POST es 'seguro'. Si está transmitiendo datos confidenciales, debe usar SSL.

Sarel Botha
fuente
8

GETy POSTson métodos HTTP que pueden lograr objetivos similares

GETes básicamente para obtener (recuperar) datos, A GETno debe tener un cuerpo, por lo que, aparte de las cookies, el único lugar para pasar información es la URL y las URL tienen una longitud limitada, GETes menos seguro en comparación con POSTporque los datos enviados son parte de la URL

¡Nunca lo use GETal enviar contraseñas, tarjetas de crédito u otra información confidencial! Los datos son visibles para todos en la URL. Se pueden almacenar en caché. GETes inofensivo cuando estamos recargando o devolviendo el botón, estará marcado en el libro, los parámetros permanecerán en el historial del navegador, solo se permiten caracteres ASCII.

POSTpuede implicar cualquier cosa, como almacenar o actualizar datos, ordenar un producto o enviar un correo electrónico. POSTEl método tiene un cuerpo.

POSTEl método está asegurado para pasar información confidencial y confidencial al servidor, no será visible en los parámetros de consulta en la URL y los parámetros no se guardarán en el historial del navegador. No hay restricciones en la longitud de los datos. Cuando volvamos a cargar, el navegador debe alertar al usuario de que los datos están a punto de volver a enviarse. POSTel método no puede ser marcado

usuario3540599
fuente
3
  1. El método GET se usa para enviar los datos menos confidenciales, mientras que el método POST se usa para enviar los datos confidenciales.
  2. Usando el método POST puede enviar una gran cantidad de datos en comparación con el método GET.
  3. Los datos enviados por el método GET son visibles en la barra de encabezado del navegador, mientras que los datos enviados por el método POST son invisibles.
Miel
fuente
0

Use el método GET si desea recuperar los recursos de la URL. Siempre puede ver la última página si presiona el botón Atrás de su navegador, y podría estar marcado, por lo que no es tan seguro como el método POST.

Use el método POST si desea 'enviar' algo a la URL. Por ejemplo, si desea crear una cuenta de Google y es posible que deba completar toda la información detallada, luego presione el botón 'enviar' (se llama al método POST aquí), una vez que envíe con éxito, e intente presionar el botón Atrás de su navegador , recibirá un error o un nuevo formulario en blanco, en lugar de la última página con el formulario completado.

RobotCharlie
fuente
-10

El GETmétodo:

  • Se usa solo para enviar una fecha de 256 caracteres

  • Al usar este método, la información se puede ver en el navegador

  • Es el método predeterminado utilizado por los formularios.

  • No está tan asegurado.


El POSTmétodo:

  • Se utiliza para enviar datos ilimitados.

  • Con este método, la información no se puede ver en el navegador

  • Puedes mencionar explícitamente el POSTmétodo

  • Es más seguro que el GETmétodo.

  • Proporciona funciones más avanzadas.

Sidharam Anache
fuente
"Se usa solo para enviar una fecha de 256 caracteres" - no es cierto. "Cuando se usa este método, la información se puede ver en el navegador": los datos de publicación también son visibles en los navegadores, simplemente no es tan obvio. "Proporciona funciones más avanzadas", como?
Quentin
Esta no es una respuesta terriblemente útil. Información incorrecta como "no está tan seguro" y "proporciona características más avanzadas" y otras cosas mencionadas por Quentin.
Andrew Barber