594 Stimmen

Abmelden: GET oder POST?

In dieser Frage geht es nicht darum, wann man GET oder POST im Allgemeinen verwenden sollte; Es geht darum, welches die empfohlene Lösung für das Abmelden von einer Webanwendung ist. Ich habe viele Informationen über die Unterschiede zwischen GET und POST im allgemeinen Sinne gefunden, aber ich habe keine eindeutige Antwort für dieses spezielle Szenario gefunden.

Als Pragmatiker neige ich dazu, GET zu verwenden, weil die Implementierung viel einfacher ist als POST; man muss nur einen einfachen Link einfügen, und schon ist man fertig. Dies scheint bei der großen Mehrheit der Websites der Fall zu sein, die mir einfallen, zumindest wenn ich mich recht entsinne. Sogar Stack Overflow loggt sich mit GET aus.

Was mich zögern lässt, ist das (wenn auch alte) Argument, dass einige Web-Beschleuniger/Proxys Seiten vorcachen, indem sie jeden Link, den sie auf der Seite finden, abrufen, so dass der Benutzer eine schnellere Antwort erhält, wenn er darauf klickt. Ich bin mir nicht sicher, ob dies immer noch zutrifft, aber wenn dies der Fall wäre, dann würde theoretisch ein Benutzer mit einem dieser Beschleuniger aus der Anwendung geworfen werden, sobald er sich anmeldet, weil sein Beschleuniger den Abmeldelink finden und abrufen würde, auch wenn er ihn nie angeklickt hat.

Alles, was ich bisher gelesen habe, deutet darauf hin, dass POST sollte für "destruktive Aktionen" verwendet werden, während Aktionen, die den internen Zustand der Anwendung nicht verändern - wie Abfragen und dergleichen - mit GET behandelt werden sollten. . Die eigentliche Frage, die sich hier stellt, ist also:

Gilt das Abmelden von einer Anwendung als destruktive Aktion bzw. wird der interne Zustand der Anwendung verändert?

0 Stimmen

Wenn Sie die Website zum ersten Mal besuchen und der Abmeldelink nicht vorhanden ist, werden Sie beim Anmelden abgemeldet. Wenn Sie sich ein zweites Mal anmelden, ist das kein Problem, da die Abmelde-URL bereits im Cache gespeichert ist. Man kann aber davon ausgehen, dass jeder anständige Beschleuniger in der Lage ist, die meisten Logout-URLs herauszufiltern.

2 Stimmen

HyperCas, das Herausfiltern von Logout-URLs durch Beschleuniger war eine Theorie, die ich in Betracht gezogen habe, und einer der Gründe, warum ich mich entschlossen habe, die Frage zu stellen. Es widerstrebt mir, einfach der Logik der Beschleuniger zu vertrauen und eines Tages eine Benutzerin mit einem schlechten Beschleuniger zu haben, die sich beschwert, dass sie sich nicht anmelden kann. Wissen Sie, ob sie einem Standard folgen, oder ob ein solcher Standard existiert?

0 Stimmen

Jeder Accelerator, der automatisch ein Formular übermittelt (zum Beispiel), wäre IMO Malware... es ist völlig unlogisch zu denken, dass ein Accelerator automatisch ein Formular übermitteln würde. Stellen Sie sich vor, Sie besuchen Google. Wie könnte er das Suchformular übermitteln? Niemand kann für Malware verantwortlich gemacht werden, da sie zu unberechenbar ist und sich nicht an die Regeln hält.

17voto

Joel Etherton Punkte 36629

Das Abmelden hat keinen Einfluss auf die Anwendung selbst. Es ändert nur den Status des Benutzers in Bezug auf die Anwendung. In diesem Fall scheint Ihre Frage eher darauf zu basieren, wie der Befehl vom Benutzer initiiert werden sollte, um diese Aktion zu starten. Da es sich nicht um eine "zerstörerische Aktion" handelt, d.h. die Sitzung wird zwar verlassen oder zerstört, aber weder die Anwendung noch die Daten werden verändert, ist es nicht undurchführbar, beide Methoden zur Einleitung eines Abmeldevorgangs zuzulassen. Post sollte für alle vom Benutzer initiierten Aktionen verwendet werden (z.B. - Benutzer klickt auf "Abmelden"), während get für von der Anwendung initiierte Abmeldungen reserviert werden könnte (z.B. - eine Ausnahme, die ein mögliches Eindringen des Benutzers feststellt, leitet zwangsweise zur Anmeldeseite mit einem Logout-GET um).

0 Stimmen

Es ist denkbar, dass dies von der Anwendung abhängt (eine Art "kaskadierendes Löschverhalten"), aber Sie haben Recht.

0 Stimmen

@JoelEtherton Danke Joel, ich habe mir die Antworten durchgelesen und mich gefragt, wann ich die richtige finden würde :)

4 Stimmen

Das ist verwirrend, weil das Abmelden den Status ändert. POST ist das Verb für die Zustandsänderung. GET dient zum Abrufen zustandsloser Daten. Es ist verwirrend, weil wir erwarten, dass POST-Anfragen Nutzdaten haben. Wie unten erwähnt, wäre DELETE bei einem Sitzungsobjekt am korrektesten.

1voto

Richard H Punkte 36131

Das Szenario des Pre-Caching ist interessant. Aber ich vermute, dass, wenn viele Websites inc SO sich nicht darum kümmern, dann sollten Sie vielleicht auch nicht.

Oder könnte der Link vielleicht in Javascript implementiert werden?

Edit: So wie ich es verstehe, sollte technisch gesehen ein GET für reine Leseanfragen sein, die den Zustand der Anwendung nicht verändern. Ein POST sollte für Schreib-/Bearbeitungsanfragen sein, die den Zustand ändern. Andere Anwendungsprobleme könnten jedoch GET gegenüber POST für einige zustandsändernde Anfragen bevorzugen, und ich glaube nicht, dass es damit ein Problem gibt.

0 Stimmen

Danke. Die DB Zustand würde nicht geändert werden, aber die Sitzung Staat würde. Das einzige Problem, das ich sehe, ist das, das ich in der Frage erwähnt habe, nämlich dass Nutzer rausgeschmissen werden. Das ist nicht destruktiv, aber ziemlich ärgerlich. Ich halte mich normalerweise auch an das Mantra "wenn die Großen es tun, dann muss es in Ordnung sein". Ich wollte nur wissen, welche Meinung andere dazu haben.

-1voto

Rob Punkte 1738

Nun, wenn Sie Ihre Webanwendung die Sitzung durch ein Abmeldeskript beenden lassen, brauchen Sie normalerweise beides nicht. Normalerweise gibt es eine Sitzungsvariable, die für die zu beendende Sitzung eindeutig ist.

0 Stimmen

Könnten Sie das "Abmeldeskript" näher erläutern? Ich bin mir nicht sicher, ob Sie sich auf das Setzen eines Cookie-Ablaufs beziehen (was die Notwendigkeit einer Möglichkeit, die Benutzer manuell abzumelden, nicht beseitigt).

0 Stimmen

Ein Abmeldeskript würde die Sitzung des Benutzers (eigentlich: Browsers) beenden, der es aufruft. In ASP.net ist die Sitzung ein serverseitiges Objekt, das abgebrochen werden kann. PHP hat ein ähnliches System. Da der Browser das Skript aufruft, das die Sitzung beendet, weiß er bereits, welche Sitzung er beenden muss, wodurch POST- oder GET-Variablen überflüssig werden.

1 Stimmen

Ja, jetzt verstehe ich Sie. Ich habe bereits das Skript an Ort und Stelle, insbesondere FormsAuthentication.SignOut(), aber meine Frage ist über wie um das Skript aufzurufen, wie bei GET oder POST.

-2voto

jpluijmers Punkte 360

Ich verstehe nicht, wie das Abmelden (Entziehen der Benutzerrechte) eine destruktive Handlung sein soll. Das liegt daran, dass die Aktion "Abmelden" nur für Benutzer verfügbar sein sollte, die bereits angemeldet sind, da sie sonst überflüssig wäre.

Eine zufällig generierte Zeichenkette, die in Ihren Browser-Cookies enthalten ist, repräsentiert Ihre gesamte Benutzersitzung. Es gibt viele Möglichkeiten, sie zu zerstören, so dass das effektive Abmelden lediglich ein Service für Ihre Besucher ist.

3 Stimmen

wget im Spider-Modus mit einem korrekten Sitzungs-Cookie auf einem privaten Wiki war eine Sache, die ich tatsächlich einmal tun musste. Natürlich war eine der ersten gecrawlten URLs /logout .

6 Stimmen

Gehen Sie zu SuperLogout.de um zu sehen, wie zerstörerisch GET-Anfragen an /logout Seiten wirklich sind. Sie müssen sich zum Beispiel erneut bei Google Mail anmelden, sich erneut beim Chat anmelden, Ihren Platz in den Hangouts-Unterhaltungen finden, die Sie gescrollt hatten, usw. - und das gilt nur für Google.com.

6 Stimmen

@DanDascalescu Sie sollten die Leute warnen, dass der Besuch dieser Seite sie sofort abmeldet und es keine Bestätigungsschaltfläche gibt! sehr wütendes Emoji

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X