Sur Internet, je vois les conseils suivants:
GET ne doit jamais modifier les données sur le serveur. Utilisez une requête POST pour cela.
Quelle est la base de cette idée?
Si je crée un service php qui insère des données dans la base de données et les transmet dans la chaîne de requête GET, pourquoi est-ce erroné? (J'utilise des instructions préparées pour prendre en charge l'injection SQL). Une demande POST est-elle en quelque sorte plus sécurisée?
Ou y a-t-il une raison historique à cela? Si oui, quelle est la validité de ce conseil aujourd'hui?
http
http-request
Devdatta Tengshe
la source
la source
Réponses:
Ce n'est pas un conseil.
A
GET
est défini de cette manière dans le protocole HTTP . Il est supposé être idempotent et sûr .Quant à pourquoi - un
GET
peut être mis en cache et dans un navigateur, actualisé. Encore et encore et encore.Cela signifie que si vous
GET
reproduisez la même chose , vous l'insérerez à nouveau dans votre base de données .Considérez ce que cela signifie si le
GET
devient un lien et que le moteur de recherche l'explore. Vous aurez votre base de données pleine de données en double.Je suggère également de lire les URI, l’adressabilité et l’utilisation de HTTP GET et POST .
Il existe également un problème de prélecture de lien dans certains navigateurs: ils effectueront un appel pour rechercher des liens, même si cela n’a pas été indiqué par l’auteur de la page.
Si, par exemple, votre déconnexion est derrière un "GET", lié à chaque page de votre site, les utilisateurs peuvent se déconnecter simplement en raison de ce comportement.
la source
GET
ce ne sera jamais une action destructrice (à juste titre, puisque c'est spécifié de cette façon). Si vous cassez maintenant votre application en violant cette spécification, vous garderez les deux parties de votre application.GET
. Ce conseil est tout simplement faux. Coffre-fort signifie que l'utilisateur ne peut pas être tenu responsable des effets secondaires, pas qu'il ne puisse en exister. Sinon, vous ne pourriez pas avoir de fichiers journaux pour votre serveur, ce qui serait absurde! Ceci est expliqué clairement dans la section 9.1.1 de la RFC2616.GET
ne devrait pas changer la ressource demandée par leGET
, mais cela ne veut pas dire "rien sur le serveur ne devrait changer". Bien sûr, des éléments tels que les journaux, les compteurs et les autres états du serveur peuvent changer lors de toute demande.Chaque verbe HTTP a sa propre responsabilité. Par exemple
GET
, tel que défini par RFCPOST
d'autre part, signifie insérer ou plus formellementRaisons pour le garder de cette façon:
GET
de jouer le rôle de moyens de récupération d'informations et d'exploration de donnéesGET
est effectivement une lecture , alors qu’ellePOST
est effectivement une écritureGET
la même URL doit renvoyer les mêmes résultats à tous les utilisateurs, sans quoi vous n'aurez aucune confiance dans le résultat renvoyé.Pour être complet et simplement imposer l'utilisation correcte (source) :
GET
les paramètres sont transmis dans le cadre de l'URL, qui est par défaut d'une longueur petite et limitée de 256 caractères, certains serveurs prenant en charge plus de 4000 caractères. Si vous souhaitez insérer un long enregistrement, il n’existe aucun moyen légitime de transmettre ces données.̶G̶E̶T̶
̶ TRANSFÉRÉ PLAIN TExt sont. L'URL est actuellement crypté avec TLS, donc TLS va bien.GET
n'est pas pratiqueGET
est ré-exécuté si un utilisateur appuie sur un bouton Précédent dans un navigateur?
signe à l'intérieurla source
EDIT: Avant, j’ai dit que le POST aide à vous protéger contre le CSRF mais c’est faux. Je n'y pensais pas correctement. Vous devez exiger un jeton masqué unique de la portée de la session dans toutes vos demandes de modification des données afin de vous protéger contre CSRF.
Au début de l'Internet, il existait des accélérateurs de navigateur. Ces programmes commenceraient à cliquer sur des liens sur une page pour mettre en cache le contenu. Google Web Accelerator était l'un de ces programmes. Cela pourrait causer des dégâts sur une application qui apporte des modifications lorsqu'un lien est cliqué. Je supposerais qu'il y a encore des personnes qui utilisent un logiciel d'accélérateur.
Les serveurs proxy et les navigateurs vont mettre en cache les requêtes GET. Ainsi, lorsque l'utilisateur accède à la page, il peut ne pas envoyer la requête à votre application. Il pense donc avoir pris une mesure, mais ce n'est pas le cas.
la source
La réponse la plus simple est "parce que ce n'est pas ce que
GET
signifie".Utiliser
GET
pour transmettre des données pour une mise à jour revient à écrire une lettre d'amour et à l'envoyer dans une enveloppe portant la mention "OFFRE SPÉCIALE - AGISSEZ MAINTENANT!" Dans les deux cas, vous ne devriez pas être surpris que le destinataire et / ou les intermédiaires traitent mal votre message .la source
Pour vos opérations CRUD dans une application centrée sur la base de données, utilisez le schéma suivant:
Utiliser HTTP GET pour les opérations de lecture (SQL SELECT)
Utiliser HTTP PUT pour les opérations de mise à jour (SQL UPDATE)
Utiliser HTTP POST pour créer des opérations (SQL INSERT)
Utiliser HTTP DELETE pour les opérations de suppression (SQL DELETE)
la source
Ce conseil, et toutes les réponses ici sont fausses. Évidemment, je suis trop dramatique, les autres réponses sont excellentes, mais je crois que le conseil exact devrait être donné comme suit:
Dire «jamais» est trop extrême, et bien que les autres réponses ici expliquent avec précision pourquoi vous devriez le faire «rarement», il existe des scénarios dans lesquels il est parfaitement raisonnable de modifier les données avec une méthode GET. Un exemple est un lien de vérification de courrier électronique à usage unique. Généralement, ces liens contiennent un GUID qui, lorsqu’on y a accès, devra modifier les données. Si elles sont correctement implémentées, les requêtes GET identiques suivantes seront ignorées.
Il s’agit bien évidemment d’un cas extrême, mais il convient de le noter.
la source