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

War es hilfreich?

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.

die HTTP 1.1 RFC 2616

  

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top