Pourquoi devriez-vous supprimer en utilisant un HTTP POST ou SUPPRIMER, plutôt que de les OBTENIR?
J'ai travaillé par le biais de Microsoft ASP.NET MVC tutoriels, se terminant à cette page
http://www.asp.net/learn/mvc/tutorial-32-cs.aspx
L'instruction suivante est effectuée vers le bas de cette page:
En général, vous ne voulez pas effectuer une opération HTTP GET lors de l'appel d'une action qui modifie l'état de votre application web. Lors de l'exécution d'une suppression, vous souhaitez effectuer un HTTP POST, ou mieux encore, un HTTP opération de SUPPRESSION.
Est-ce vrai? Quelqu'un peut-il offrir une explication plus détaillée de la justification de cette affirmation?
Modifier
Wikipédia les états suivants:
Certaines méthodes (par exemple, de la TÊTE, d'OBTENIR, d'OPTIONS et de TRACE) sont définies comme "sûrs", ce qui signifie qu'ils sont destinés uniquement pour la recherche d'information et ne devraient pas changer l'état du serveur.
En revanche, les méthodes telles que POST, PUT et DELETE sont destinés à des actions qui peuvent causer des effets secondaires sur le serveur
Vous devez vous connecter pour publier un commentaire.
Jon Skeet réponse est la réponse canonique. Mais: Supposons que vous avez un lien:
et le google-bot vient le long et les index de votre page? Ce qui arrive ensuite?
<img src="DeleteImportantData.aspx?UserID=27">
choses.OBTENIR est conventionnelle-gratuite de des effets secondaires- en d'autres termes, il ne modifie pas l'état. Cela signifie que les résultats peuvent être mis en cache, les signets peuvent être effectués en toute sécurité, etc.
De le HTTP 1.1 RFC 2616
HTTP DELETE
est la quantité, maisHTTP POST
ne l'est pas.GET
etHEAD
ont le supplémentaire convention (en plus d'idempotence) de ne pas produire d'effets secondaires même sur la demande initiale. Voir stephenwalther.com/archive/2009/01/21/...En dehors de puriste questions autour de l'être idempotent, il y a un côté pratique: les araignées/robots/robots, etc. suivre les liens hypertexte. Si vous avez votre "supprimer" action comme un lien hypertexte qui est un GET, alors google peut gaiement supprimer toutes vos données. Voir "L'Araignée de Doom".
Avec des billets, ce n'est pas un risque.
Un autre exemple..
Cela permettra de supprimer cet article, si vous êtes connecté et que vous avez le droit à des privilèges. Si votre site accepte les commentaires, par exemple, et un utilisateur envoie ce lien comme une image; de la sorte:
Puis quand vous vous en tant qu'utilisateur administrateur viens de parcourir les commentaires sur votre site, le navigateur va essayer de récupérer cette image par l'envoi d'une demande à cette URL. Mais parce que vous êtes connecté, alors que le navigateur est cela, l'article sera alors supprimé.
Vous ne pouvez pas le même avis, sans regarder le code source comme la plupart des navigateurs l'habitude de montrer quoi que ce soit s'il ne peut pas trouver une image.
L'espoir qui fait sens.
Veuillez voir ma réponse ici. Il s'applique également à cette question.
En plus les araignées et les demandes idempotent il y a aussi un problème de sécurité avec les requêtes get. Quelqu'un peut facilement envoyer à vos utilisateurs un e-mail avec
dans le texte et le navigateur seront heureux de vous aller et d'essayer d'accéder à la ressource. À l'aide de POST n'est pas un remède pour de telles choses (que vous pouvez mettre ensemble un post de formulaire en javascript assez facilement), mais c'est un bon début.
Sur ce sujet (HTTP méthodes d'utilisation), je recommande la lecture de ce billet de blog: http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/
C'est en fait le problème inverse: pourquoi ne pas utiliser POST lorsque aucune donnée n'est changé.
Disons que nous avons un services bancaires par internet et nous visitez la page de transfert. L'utilisateur choisit de transfert de 10 $à un autre compte.
Cliquant sur le bouton soumettre des redirections (comme une demande GET) pour https://my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j
Mais la connexion internet est lente et/ou les serveur(s) est(sont) bien remplie donc, après avoir cliquer sur le bouton soumettre la nouvelle page est en cours de chargement lent.
L'utilisateur est frustré et commence à frapper la touche F5 (actualiser la page) furieusement. Devinez ce qui va arriver? Plus d'un transfert se fera éventuellement vider le compte de l'utilisateur.
Maintenant, si la demande en est faite, comme la POSTE (ou autre chose que GET) la première F5 (actualiser la page) que l'utilisateur fera le navigateur va doucement de demander "êtes-vous sûr de vouloir faire ça? Il peut avoir des effets secondaires [ bla bla bla ] ... "
En dehors de toutes les excellentes raisons mentionnées ici, les requêtes GET pourrait être enregistré par le serveur destinataire, comme dans le
access.log
. Si vous envoyez à travers des données sensibles comme les mots de passe dans la demande, ils vont se connecté en tant que texte brut.Même si ils sont hachés/salé pour sécuriser DB de stockage, une violation (ou quelqu'un regarde par-dessus l'informaticien de l'épaule) pourrait révéler. De telles données devraient aller dans le POST corps.
Une autre question que la commande va à la barre d'adresse du navigateur. Donc, si vous actualisez la page, vous émettez la commande de nouveau, que ce soit "supprimer le dernier truc", "soumettre la commande" ou similaire.