En todo Internet, veo el siguiente consejo:
Un GET nunca debe cambiar los datos en el servidor; use una solicitud POST para eso
¿Cuál es la base de esta idea?
Si hago un servicio php que inserta datos en la base de datos y le paso los parámetros en la cadena de consulta GET, ¿por qué eso es incorrecto? (Estoy usando declaraciones preparadas, para encargarme de la inyección SQL). ¿Es una solicitud POST de alguna manera más segura?
¿O hay alguna razón histórica para esto? Si es así, ¿qué tan válido es este consejo hoy?
http
http-request
Devdatta Tengshe
fuente
fuente
Respuestas:
Esto no es un consejo.
A
GET
se define de esta manera en el protocolo HTTP . Se supone que es idempotente y seguro .En cuanto a por qué,
GET
se puede almacenar en caché y actualizar en un navegador. Una y otra vez.Esto significa que si se hace el mismo
GET
de nuevo, se va a insertar en la base de datos de nuevo .Considere lo que esto puede significar si se
GET
convierte en un enlace y un motor de búsqueda lo rastrea. Tendrá su base de datos llena de datos duplicados.También sugiero leer los URI, la capacidad de direccionamiento y el uso de HTTP GET y POST .
También hay un problema con la captación previa de enlaces en algunos navegadores: realizarán una llamada para buscar enlaces, incluso si el autor de la página no lo indica.
Si, por ejemplo, su cierre de sesión está detrás de un "GET", vinculado desde cada página de su sitio, las personas pueden cerrar sesión solo debido a este comportamiento.
fuente
GET
nunca será una acción destructiva (con razón, ya que se especifica de esta manera). Si ahora rompe su aplicación al romper esa especificación, podrá conservar ambas partes de su aplicación.GET
. Ese consejo es simplemente incorrecto. Seguro significa que el usuario no puede ser considerado responsable de los efectos secundarios, no que no puede haber efectos secundarios. De lo contrario, no podría tener archivos de registro para su servidor, ¡lo cual sería absurdo! Esto se explica claramente en la sección 9.1.1 de RFC2616.GET
no debería cambiar el recurso solicitado por elGET
, pero eso no significa 'nada en el servidor debería cambiar'. Por supuesto, cosas como registros, contadores y otros estados del servidor pueden cambiar durante cualquier solicitud.Cada verbo HTTP tiene su propia responsabilidad. Por ejemplo
GET
, según lo definido por RFCPOST
, por otro lado, significa insertar o más formalmenteRazones para mantenerlo de esta manera:
GET
para actuar como medios de recuperación de información y minería de datosGET
es efectivamente una lectura , mientrasPOST
que efectivamente es una escrituraGET
a la misma URL debe devolver los mismos resultados a todos los usuarios o, de lo contrario, no tendrá ninguna confianza en el resultado devueltoPara completar y solo para aplicar el uso correcto (fuente) :
GET
los parámetros se pasan como parte de la URL, que tiene una longitud pequeña y limitada de 256 caracteres de forma predeterminada, y algunos servidores admiten más de 4000 caracteres. Si desea insertar un registro largo, no hay una forma legítima de pasar estos datos en̶G̶E̶T̶
̶ se transfieren texto sin formato. La URL está actualmente encriptada con TLS, por lo que TLS está bien.GET
es prácticoGET
se vuelve a ejecutar si un usuario presiona el botón Atrás en un navegador?
signo dentrofuente
EDITAR: Antes, dije POST ayuda a protegerlo contra CSRF pero esto está mal. No pensé esto correctamente. Debe requerir un token oculto único de alcance de sesión en todas sus solicitudes para cambiar los datos para protegerse contra CSRF.
En los primeros días de internet había aceleradores de navegador. Estos programas comenzarían a hacer clic en los enlaces de una página para almacenar en caché el contenido. Google Web Accelerator fue uno de estos programas. Esto podría causar estragos en una aplicación que realiza cambios cuando se hace clic en un enlace. Supongo que todavía hay personas que usan software acelerador.
Los servidores y navegadores proxy almacenarán en caché las solicitudes GET, por lo que cuando el usuario acceda a la página nuevamente, es posible que no envíe la solicitud a su aplicación, por lo que el usuario cree que tomó una acción, pero realmente no lo hizo.
fuente
La respuesta más simple es "porque eso no es lo que
GET
significa".Usar
GET
para pasar datos para una actualización es como escribir una carta de amor y enviarla en un sobre marcado "OFERTA ESPECIAL - ¡ACTÚE AHORA!" En ambos casos, no debe sorprenderse que el destinatario y / o los intermediarios manejen mal su mensaje .fuente
Para sus operaciones CRUD en una aplicación centrada en la base de datos, use el siguiente esquema:
Utilice HTTP GET para operaciones de lectura (SQL SELECT)
Usar HTTP PUT para operaciones de actualización (ACTUALIZACIÓN SQL)
Utilice HTTP POST para crear operaciones (SQL INSERT)
Use HTTP DELETE para eliminar operaciones (SQL DELETE)
fuente
Ese consejo, y todas las respuestas aquí son incorrectas. Obviamente estoy siendo demasiado dramático, las otras respuestas son excelentes, pero creo que el consejo exacto se debe dar como:
Decir "nunca" es demasiado extremo, y aunque las otras respuestas aquí explican con precisión por qué "rara vez" debería hacerlo, hay algunos escenarios en los que es perfectamente razonable cambiar los datos con un GET. Un ejemplo es un enlace de verificación de correo electrónico de uso único. Por lo general, estos enlaces contienen un GUID que cuando se accede tendrá que cambiar los datos. Si se implementa correctamente, se ignorarán las solicitudes GET idénticas posteriores.
Obviamente, este es un caso extremo, pero ciertamente vale la pena señalarlo.
fuente