Überall im Internet sehe ich folgende Ratschläge:
Ein GET sollte niemals Daten auf dem Server ändern - verwenden Sie dazu eine POST-Anfrage
Was ist die Basis für diese Idee?
Wenn ich einen PHP-Dienst erstelle, der Daten in die Datenbank einfügt, und diese Parameter in die GET-Abfragezeichenfolge übergebe, warum ist das falsch? (Ich benutze vorbereitete Anweisungen, um mich um SQL Injection zu kümmern). Ist eine POST-Anfrage in gewisser Weise sicherer?
Oder gibt es einen historischen Grund dafür? Wenn ja, wie gültig ist dieser Ratschlag heute?
http
http-request
Devdatta Tengshe
quelle
quelle
Antworten:
Dies ist kein Ratschlag.
A
GET
ist auf diese Weise im HTTP-Protokoll definiert . Es soll idempotent und sicher sein .Was den Grund
GET
betrifft - a kann zwischengespeichert und in einem Browser aktualisiert werden. Immer wieder und wieder und wieder.Dies bedeutet , dass wenn Sie das gleiche machen
GET
wieder, werden Sie in Ihre Datenbank einfügen wieder .Überlegen Sie, was dies bedeuten kann, wenn der
GET
Link zu einem Link wird und von einer Suchmaschine gecrawlt wird. Sie haben Ihre Datenbank mit doppelten Daten gefüllt.Ich empfehle außerdem, URIs, Adressierbarkeit und die Verwendung von HTTP GET und POST zu lesen .
Es gibt auch ein Problem beim Vorabrufen von Links in einigen Browsern - sie rufen vorab abgerufene Links auf, auch wenn dies nicht vom Seitenautor angegeben wurde.
Wenn sich Ihre Abmeldung beispielsweise hinter einem "GET" befindet, das von jeder Seite Ihrer Website aus verlinkt wird, können sich Personen aufgrund dieses Verhaltens abmelden.
quelle
GET
niemals eine destruktive Aktion sein wird (zu Recht, da dies so festgelegt ist). Wenn Sie jetzt Ihre Anwendung durch Verletzung dieser Spezifikation brechen, behalten Sie beide Teile Ihrer Anwendung bei.GET
. Dieser Rat ist einfach falsch. Sicher bedeutet, dass der Benutzer nicht für Nebenwirkungen zur Verantwortung gezogen werden kann, nicht dass es keine Nebenwirkungen geben kann. Andernfalls könnten Sie keine Protokolldateien für Ihren Server haben, was absurd wäre! Dies ist in Abschnitt 9.1.1 von RFC2616 recht deutlich dargestellt.GET
sollte die von der angeforderte Ressource nicht ändernGET
, aber das bedeutet nicht, dass sich nichts auf dem Server ändern sollte. Natürlich können sich Dinge wie Protokolle, Leistungsindikatoren und andere Serverstatus während einer Anforderung ändern.Jedes HTTP-Verb hat seine eigene Verantwortung. Zum Beispiel
GET
wie in RFC definiertPOST
bedeutet andererseits einfügen oder formellerGründe, es so zu halten:
GET
fungieren als Mittel zum Abrufen von Informationen und zum Data MiningGET
sind effektiv ein Lesen , wohingegenPOST
es effektiv ein Schreiben istGET
muss dieselbe URL für alle Benutzer dieselben Ergebnisse zurückgeben. Andernfalls haben Sie kein Vertrauen in das zurückgegebene ErgebnisDer Vollständigkeit halber und nur zur Durchsetzung der korrekten Verwendung (Quelle) :
GET
Parameter werden als Teil der URL übergeben, die standardmäßig eine geringe und begrenzte Länge von 256 Zeichen aufweist. Einige Server unterstützen über 4000 Zeichen. Wenn Sie einen langen Datensatz einfügen möchten, gibt es keine legitime Möglichkeit, diese Daten weiterzugeben̶G̶E̶T̶
̶ übertragen Klartext. Die URL ist aktuell mit TLS verschlüsselt, daher ist TLS in Ordnung.GET
ist nicht praktikabelGET
wird erneut ausgeführt, wenn ein Benutzer in einem Browser die Schaltfläche Zurück drückt?
Zeichenquelle
EDIT: Vorher habe ich gesagt, dass POST Ihnen hilft, sich vor CSRF zu schützen, aber das ist falsch. Ich habe das nicht richtig durchdacht. Sie müssen in allen Ihren Anforderungen ein eindeutiges verstecktes Token für den Sitzungsbereich angeben, um Daten zum Schutz vor CSRF zu ändern.
In den frühen Tagen des Internets gab es Browser-Beschleuniger. Diese Programme würden anfangen, auf Links auf einer Seite zu klicken, um den Inhalt zwischenzuspeichern. Google Web Accelerator war eines dieser Programme. Dies kann zu Schäden an einer Anwendung führen, die Änderungen vornimmt, wenn auf einen Link geklickt wird. Ich würde davon ausgehen, dass es immer noch Leute gibt, die Accelerator-Software verwenden.
Proxyserver und Browser speichern GET-Anforderungen im Cache. Wenn der Benutzer erneut auf die Seite zugreift, wird die Anforderung möglicherweise nicht an Ihre Anwendung gesendet, sodass der Benutzer denkt, dass er eine Aktion ausgeführt hat, dies jedoch nicht der Fall ist.
quelle
Die einfachste Antwort ist "weil das nicht
GET
heißt".Wenn Sie
GET
Daten für ein Update weitergeben, schreiben Sie einen Liebesbrief und senden ihn in einem Umschlag mit der Aufschrift "SONDERANGEBOT - JETZT HANDELN!". In beiden Fällen sollten Sie sich nicht wundern, wenn der Empfänger und / oder die Vermittler Ihre Nachricht falsch handhaben .quelle
Verwenden Sie für Ihre CRUD- Operationen in einer datenbankzentrierten Anwendung das folgende Schema:
Verwenden Sie HTTP GET für Leseoperationen (SQL SELECT)
Verwenden Sie HTTP PUT für Aktualisierungsvorgänge (SQL UPDATE)
HTTP POST für Erstellungsvorgänge verwenden (SQL INSERT)
Verwenden Sie HTTP DELETE für Löschvorgänge (SQL DELETE)
quelle
Dieser Rat und alle Antworten hier sind falsch. Natürlich bin ich zu dramatisch, die anderen Antworten sind ausgezeichnet, aber ich glaube, der genaue Rat sollte lauten:
"Nie" zu sagen ist zu extrem und obwohl die anderen Antworten hier genau erklären, warum Sie es "selten" tun sollten, gibt es einige Szenarien, in denen es durchaus sinnvoll ist, Daten mit einem GET zu ändern. Ein Beispiel ist ein E-Mail-Bestätigungslink zur einmaligen Verwendung. In der Regel enthalten diese Links eine GUID, über die beim Zugriff Daten geändert werden müssen. Bei korrekter Implementierung werden nachfolgende identische GET-Anforderungen ignoriert.
Dies ist offensichtlich ein Randfall, aber sicherlich erwähnenswert.
quelle