Warum sollten Sie eine HTTP-POST oder DELETE löschen, anstatt GET?
-
16-09-2019 - |
Frage
Ich arbeite seit über Microsofts ASP.NET MVC-Tutorials, auf dieser Seite landen
http://www.asp.net/learn/mvc/ tutorial-32-cs.aspx
Die folgende Anweisung wird auf die unten auf dieser Seite gemacht:
In der Regel wollen Sie nicht eine HTTP-GET-Operation auszuführen, wenn eine Aktion aufrufen, die den Zustand Ihrer Web-Anwendung modifiziert. Wenn eine Löschdurchführen, möchten Sie eine HTTP-POST, oder besser noch auszuführen, eine HTTP-DELETE-Vorgang.
Ist das wahr? Kann jemand hinter dieser Aussage eine ausführlichere Erklärung für die Gründe anbieten?
Bearbeiten
Wikipedia heißt es wie folgt:
Einige Methoden (zum Beispiel, HEAD, GET, OPTIONS und TRACE) als sicher definiert, das heißt, sie nur zur Informationsgewinnung bestimmt ist und nicht den Zustand des Servers ändern.
Im Gegensatz dazu Methoden wie POST, PUT und DELETE bestimmt sind, für Maßnahmen, die Auswirkungen Seite entweder auf dem Server verursachen
Lösung
Jon Skeet Antwort ist die kanonische Antwort. Aber: Angenommen, Sie haben einen Link:
href = "\myApp\DeleteImportantData.aspx?UserID=27"
und das Google-Bot kommt und indiziert Ihre Seite? Was passiert dann?
Andere Tipps
GET ist üblicherweise frei von Nebenwirkungen - mit anderen Worten, es ist nicht der Zustand nicht ändert. Das bedeutet, können die Ergebnisse im Cache gespeichert werden, können Lesezeichen sicher etc gemacht werden.
Implementors sollten sich bewusst sein, dass die Software stellt den Benutzer in ihrer Interaktionen über das Internet, und sollte vorsichtig sein, um den Benutzer zu ermöglichen, sich bewusst sein Handlungen könnten sie nehmen, die eine unerwartete haben Bedeutung für sich selbst oder andere.
Insbesondere hat die Konvention gewesen festgestellt, dass die GET und HEAD Methoden haben, sollten Sie nicht die Bedeutung eine andere Aktion unter als Retrieval. Diese Verfahren sollten werden als „sicher“. Dies ermöglicht dem Benutzer, Mittel, andere Verfahren zu repräsentieren, wie POST, PUT und DELETE, in einem besondere Art und Weise, so dass der Benutzer gemacht sich der Tatsache bewusst, dass eine möglicherweise unsichere Aktion angefordert wird.
Natürlich ist es nicht möglich, sicherzustellen, dass der Server nicht erzeugen Nebenwirkungen als Ergebnis Durchführen einer GET-Anforderung; eigentlich, einige dynamische Ressourcen der Ansicht, dass ein Feature. Der wichtige Unterschied hier ist, dass der Benutzer nicht angefordert die Nebenwirkungen, so kann deshalb nicht statt für sie verantwortlich.
Neben puristischen Fragen rund um idempotent ist, gibt es eine praktische Seite: Spinnen / Bots / Crawler etc. werden Hyperlinks folgen. Wenn Sie Ihre „Löschen“ Aktion als Hyperlink haben, die eine GET tut, google, dann können Sie alle Ihre Daten fröhlich löschen. Siehe " die Spinne von Doom ".
Mit Pfosten, dies ist kein Risiko.
Ein weiteres Beispiel ..
http://example.com/admin/articles/delete/2
Dies wird den Artikel löschen, wenn Sie angemeldet sind und die richtigen Berechtigungen verfügen. Wenn Ihre Website akzeptiert Kommentare zum Beispiel und ein Benutzer trägt vor, dass Link als Bild; etwa so:
<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>
Dann, wenn Sie sich als Benutzer admin kam durch die Kommentare auf Ihrer Website durchsuchen der Browser das Bild zu holen versucht, durch eine Anfrage an die URL Absendung. Aber weil Sie angemeldet sind, während der Browser tut dies der Artikel gelöscht.
Sie können nicht einmal bemerken, ohne den Quellcode an, als die meisten Browser nicht nichts zeigen, wenn es nicht ein Bild finden kann.
Ich hoffe, das macht Sinn.
Bitte lesen Sie meine Antwort hier . Es gilt auch für diese Frage.
- Prefetch: Viele Web-Browser werden Prefetching verwenden. Was bedeutet dass es eine Seite, bevor Sie laden klick auf den Link. Im Vorgriff auf dem Sie werden später auf diesen Link klicken.
- Suchmaschinen: Es gibt mehrere Bots, die scannen und Index das Internet Information. Sie werden nur Ausgabe GET Anfragen. Sie wollen nicht löschen für diese etwas von einer GET-Anfrage Grund.
- Caching: GET HTTP-Anfragen nicht Zustand ändern sollen, und sie sollten idempotent werden. Idempotent bedeutet, dass Ausgabe von einmal eine Anfrage, oder der Ausgabe mehrere Male das gleiche Ergebnis. D. h gibt es keine Nebenwirkungen. Zum aus diesem Grund GET HTTP-Anforderungen sind fest an Caching gebunden.
- HTTP-Standard sagt so : Der HTTP-Standard sagt, was jede HTTP-Methode ist zum. Mehrere Programme sind so gebaut, Verwenden Sie die HTTP-Standard, und sie übernehmen dass Sie es so, wie Sie verwenden sind sollst. So müssen Sie undefiniertes Verhalten von einer Reihe von wenn Sie zufällig Programme nicht folgen.
Neben Spinnen und Anfragen, die zu idempotent gibt es auch ein Sicherheitsproblem mit GET-Anfragen. Jemand kann Ihre Benutzer eine E-Mail mit leicht senden
<img src="http://yoursite/Delete/Me" />
im Text und in dem Browser glücklich zusammen und versuchen gehen und auf die Ressource zugreifen. POST ist kein Heilmittel für solche Dinge (wie Sie zusammen ein Formular Post in Javascript ziemlich leicht setzen können), aber es ist ein guter Anfang.
Über dieses Thema (HTTP-Methoden usage), empfehle ich das Lesen dieses Blog-Post: http://blog.codevader.com/2008/11/02/why-learning-http-does-matter/
Das ist eigentlich das umgekehrte Problem: warum POST nicht verwenden, wenn keine Daten geändert werden.
Lassen Sie uns sagen, dass wir ein Internet-Banking-Anwendung haben, und wir besuchen die Übertragung Seite. Die angemeldete Benutzer wählt $ 10 auf ein anderes Konto zu übertragen.
Durch Klicken auf die Schaltfläche Umleitungen einreichen (als GET-Anforderung) an https: //my.bank.com/users/transfer?amount=10&destination=23lk3j2kj31lk2j3k2j
Aber die Internet-Verbindung ist langsam und / oder der Server (n) ist (sind) beschäftigt, so dass nach dem Submit-Button die neue Seite trifft, wird langsam geladen werden.
Der Benutzer wird frustriert und beginnt Schlagen F5 (Refresh-Seite) wütend. Ratet mal, was passieren wird? Mehr als eine Übertragung auftreten wird möglicherweise das Konto des Benutzers zu entleeren.
Nun, wenn der Antrag als POST (oder irgendetwas anderes als GET) die ersten F5 (Refresh-Seite) gemacht wird, wird der Benutzer den Browser macht sanft fragen: „Sind Sie sicher, dass Sie das tun wollen? Sie können Nebenwirkungen haben [ bla bla bla] ... „
Neben all den hervorragenden Gründen hier erwähnt, könnten GET-Anfragen durch den Empfänger-Server protokolliert werden, wie in den access.log
. Wenn Sie auf sensible Daten wie Passwörter in der Anforderung senden, werden sie als Plain-Text geloggt.
Auch wenn sie gehasht werden / gesalzen für die sichere DB Lagerung, eine Verletzung (oder jemand, der über die Schulter des IT-Mannes) können sie offenbart. Solche Daten in dem POST-Körper gehen sollten.
Ein weiteres Problem mit GET ist, dass der Befehl an die Adressleiste des Browsers geht. Also, wenn Sie die Seite aktualisieren, können Sie den Befehl erneut ausgeben, sei es „letzte Sachen löschen“, „den Auftrag einreichen“ oder ähnlich.