Ist entweder GET oder POST sicherer als das andere?

282

Was sind die Unterschiede beim Vergleich eines HTTP-GET mit einem HTTP-POST aus Sicherheitsgründen? Ist eine der Entscheidungen von Natur aus sicherer als die andere? Wenn ja warum?

Mir ist klar, dass POST keine Informationen in der URL verfügbar macht, aber gibt es einen wirklichen Wert darin oder ist es nur Sicherheit durch Dunkelheit? Gibt es jemals einen Grund, warum ich POST bevorzugen sollte, wenn Sicherheit ein Problem ist?

Bearbeiten:
Über HTTPS werden POST-Daten verschlüsselt. Könnten URLs jedoch von einem Drittanbieter abgehört werden? Außerdem beschäftige ich mich mit JSP; Wenn Sie JSP oder ein ähnliches Framework verwenden, ist es fair zu sagen, dass die beste Vorgehensweise darin besteht, zu vermeiden, dass vertrauliche Daten vollständig in POST oder GET platziert werden, und stattdessen serverseitigen Code zu verwenden, um vertrauliche Informationen zu verarbeiten.

James McMahon
quelle
1
Es gibt einen schönen Blogeintrag dazu auf Jeffs Blog Coding Horror: Cross-Site Request Forgeries and You .
fhe
Würden Sie POST nicht für die meisten Dinge verwenden? Angenommen, Sie müssten für eine API Daten aus einer Datenbank abrufen, aber bevor der Server Daten zurückgibt, müssten Sie zuerst authentifiziert werden? Mit post würden Sie einfach Ihre Sitzungs-ID + alle Parameter übergeben, die Sie für die Anfrage benötigen. Wenn Sie hierfür eine GET-Anforderung verwendet haben, kann Ihre Sitzungs-ID leicht entweder in Ihrem Browserverlauf oder irgendwo in der Mitte gefunden werden.
James111
Ich erinnere mich an diese Diskussion vor dem Krieg (99 'oder '00 oder so), als https nicht vorherrschte.
David Tonhofer
@ DavidTonhofer, auf welchen Krieg beziehen Sie sich? Der Browserkrieg?
DeltaFlyer
@ DeltaFlyer Nein, der Forever War on Stuff, auch bekannt als GWOT. Was haben wir getan.
David Tonhofer

Antworten:

206

In Bezug auf die Sicherheit sind sie von Natur aus gleich. Zwar macht POST keine Informationen über die URL verfügbar, es werden jedoch genauso viele Informationen wie bei einem GET in der tatsächlichen Netzwerkkommunikation zwischen Client und Server verfügbar gemacht. Wenn Sie vertrauliche Informationen weitergeben müssen, besteht Ihre erste Verteidigungslinie darin, diese über Secure HTTP weiterzugeben.

GET- oder Abfragezeichenfolgenbeiträge eignen sich hervorragend für Informationen, die entweder zum Lesezeichen eines bestimmten Elements oder zur Unterstützung bei der Suchmaschinenoptimierung und Indizierung von Elementen erforderlich sind.

POST eignet sich für Standardformulare, mit denen einmalige Daten übermittelt werden. Ich würde GET nicht zum Posten tatsächlicher Formulare verwenden, es sei denn, Sie möchten dem Benutzer erlauben, die Abfrage in einem Lesezeichen oder in einem ähnlichen Sinne zu speichern.

stephenbayer
quelle
5
Mit der Einschränkung, dass für ein GET die in der Positionsleiste angezeigte URL Daten anzeigen kann, die in einem POST verborgen wären.
Tvanfosson
93
Es ist nur im naivsten Sinne versteckt
davetron5000
7
stimmt, aber Sie können auch sagen, dass die Tastatur unsicher ist, weil jemand Ihnen bei der Eingabe Ihres Passworts über die Schulter schauen könnte. Es gibt kaum einen Unterschied zwischen Sicherheit durch Dunkelheit und überhaupt keiner Sicherheit.
Stephenbayer
65
Die Sichtbarkeit (und das Caching) von Querystrings in der URL und damit im Adressfeld ist deutlich weniger sicher. Es gibt keine absolute Sicherheit, daher sind Sicherheitsgrade relevant.
pbreitenbach
6
Es ist sogar ausgesetzt, wenn Sie einen Beitrag verwenden. In Ihrem Fall wäre die Post etwas sicherer. Aber im Ernst. Ich kann Post-Variablen den ganzen Tag ändern, genauso einfach wie Variablen abrufen. Cookies können sogar angezeigt und geändert werden. Verlassen Sie sich niemals auf die Informationen, die Ihre Website in irgendeiner Form sendet. Je mehr Sicherheit Sie benötigen, desto mehr Überprüfungsmethoden sollten vorhanden sein.
Stephenbayer
428

Die GET-Anforderung ist geringfügig weniger sicher als die POST-Anforderung. Keiner bietet echte "Sicherheit" für sich; Durch die Verwendung von POST-Anfragen wird Ihre Website nicht auf magische Weise spürbar vor böswilligen Angriffen geschützt. Die Verwendung von GET-Anforderungen kann jedoch eine ansonsten sichere Anwendung unsicher machen.

Das Mantra, dass Sie "keine GET-Anforderungen verwenden dürfen, um Änderungen vorzunehmen", ist immer noch sehr gültig, aber dies hat wenig mit böswillig zu tun Verhalten . Anmeldeformulare reagieren am empfindlichsten darauf, mit dem falschen Anforderungstyp gesendet zu werden.

Suche nach Spinnen und Webbeschleunigern

Dies ist der eigentliche Grund, warum Sie POST-Anforderungen zum Ändern von Daten verwenden sollten. Suchspinnen folgen jedem Link auf Ihrer Website, senden jedoch keine zufälligen Formulare, die sie finden.

Webbeschleuniger sind schlechter als Suchspinnen, da sie auf dem Computer des Clients ausgeführt werden und alle Links im Kontext des angemeldeten Benutzers "anklicken" . Daher befolgt eine Anwendung, die eine GET-Anforderung zum Löschen von Inhalten verwendet, auch wenn ein Administrator erforderlich ist, gerne die Anweisungen des (nicht böswilligen!) Webbeschleunigers und löscht alles, was sie sieht .

Verwirrter stellvertretender Angriff

Ein verwirrter Stellvertreterangriff (wobei der Stellvertreter der Browser ist) ist möglich, unabhängig davon, ob Sie eine GET- oder eine POST-Anforderung verwenden .

Auf von Angreifern kontrollierten Websites können GET und POST ohne Benutzerinteraktion gleichermaßen einfach übermittelt werden .

Das einzige Szenario, in dem POST etwas weniger anfällig ist, besteht darin, dass viele Websites, die nicht unter der Kontrolle des Angreifers stehen (z. B. ein Forum eines Drittanbieters), das Einbetten beliebiger Bilder ermöglichen (wodurch der Angreifer eine beliebige GET-Anforderung einfügen kann), aber alle verhindern Möglichkeiten zum Injizieren einer willkürlichen POST-Anforderung, ob automatisch oder manuell.

Man könnte argumentieren, dass Webbeschleuniger ein Beispiel für einen verwirrten Angriff der Stellvertreter sind, aber das ist nur eine Frage der Definition. Wenn überhaupt, hat ein böswilliger Angreifer keine Kontrolle darüber, so dass es kaum ein Angriff ist , selbst wenn der Stellvertreter es ist verwirrt.

Proxy-Protokolle

Proxyserver protokollieren wahrscheinlich GET-URLs vollständig, ohne die Abfragezeichenfolge zu entfernen. POST-Anforderungsparameter werden normalerweise nicht protokolliert. In beiden Fällen ist es unwahrscheinlich, dass Cookies protokolliert werden. (Beispiel)

Dies ist ein sehr schwaches Argument für POST. Erstens kann unverschlüsselter Verkehr vollständig protokolliert werden. Ein böswilliger Proxy hat bereits alles, was er braucht. Zweitens sind die Anforderungsparameter für einen Angreifer von begrenztem Nutzen: Was sie wirklich benötigen, sind die Cookies. Wenn sie also nur Proxy-Protokolle haben, ist es unwahrscheinlich, dass sie entweder eine GET- oder eine POST-URL angreifen können.

Es gibt eine Ausnahme für Anmeldeanfragen: Diese enthalten in der Regel das Kennwort des Benutzers. Wenn Sie dies im Proxy-Protokoll speichern, wird ein Angriffsvektor geöffnet, der im Fall von POST nicht vorhanden ist. Die Anmeldung über einfaches HTTP ist jedoch ohnehin von Natur aus unsicher.

Proxy-Cache

Caching-Proxys behalten möglicherweise GET-Antworten bei, jedoch keine POST-Antworten. Allerdings können GET-Antworten mit weniger Aufwand nicht zwischengespeichert werden, als wenn die URL in einen POST-Handler konvertiert wird.

HTTP "Referer"

Wenn der Benutzer von der Seite, die als Antwort auf eine GET-Anfrage bereitgestellt wird, zu einer Website eines Drittanbieters navigiert, werden auf dieser Website eines Drittanbieters alle Parameter der GET-Anforderung angezeigt.

Gehört zur Kategorie "Anforderungsparameter an Dritte weitergeben", deren Schweregrad davon abhängt, was in diesen Parametern vorhanden ist. POST-Anfragen sind natürlich immun dagegen. Um jedoch die GET-Anfrage auszunutzen, müsste ein Hacker einen Link zu seiner eigenen Website in die Antwort des Servers einfügen.

Browserverlauf

Dies ist dem Argument "Proxy-Protokolle" sehr ähnlich: GET-Anforderungen werden zusammen mit ihren Parametern im Browserverlauf gespeichert. Der Angreifer kann diese leicht erhalten, wenn er physischen Zugriff auf die Maschine hat.

Browser-Aktualisierungsaktion

Der Browser wiederholt eine GET-Anfrage, sobald der Benutzer auf "Aktualisieren" klickt. Dies kann beim Wiederherstellen von Registerkarten nach dem Herunterfahren der Fall sein. Jede Aktion (z. B. eine Zahlung) wird daher ohne Vorwarnung wiederholt.

Der Browser wiederholt eine POST-Anforderung nicht ohne Warnung.

Dies ist ein guter Grund, nur POST-Anforderungen zum Ändern von Daten zu verwenden, hat jedoch nichts mit böswilligem Verhalten und damit mit Sicherheit zu tun.

Also was soll ich tun?

  • Verwenden Sie nur POST-Anforderungen, um Daten zu ändern, hauptsächlich aus nicht sicherheitsrelevanten Gründen.
  • Verwenden Sie nur POST-Anforderungen für Anmeldeformulare. Andernfalls werden Angriffsvektoren eingeführt.
  • Wenn Ihre Site vertrauliche Vorgänge ausführt, benötigen Sie wirklich jemanden, der weiß, was er tut, da dies nicht in einer einzigen Antwort behandelt werden kann. Sie müssen HTTPS, HSTS, CSP, SQL-Injection, Script Injection (XSS) , CSRF und eine Vielzahl anderer Dinge verwenden, die für Ihre Plattform spezifisch sein können (z. B. die Sicherheitsanfälligkeit bezüglich Massenzuweisung in verschiedenen Frameworks: ASP.NET MVC , Ruby on Rails usw.). Es gibt keine einzige Sache, die den Unterschied zwischen "sicher" (nicht ausnutzbar) und "nicht sicher" ausmacht.

Über HTTPS werden POST-Daten verschlüsselt. Könnten URLs jedoch von einem Drittanbieter abgehört werden?

Nein, sie können nicht beschnuppert werden. Die URLs werden jedoch im Browserverlauf gespeichert.

Wäre es fair zu sagen, dass die beste Vorgehensweise darin besteht, zu vermeiden, dass vertrauliche Daten vollständig in den POST oder GET gestellt werden, und stattdessen serverseitigen Code zu verwenden, um vertrauliche Informationen zu verarbeiten?

Kommt darauf an, wie empfindlich es ist oder genauer gesagt, auf welche Weise. Offensichtlich wird der Kunde es sehen. Jeder, der physischen Zugriff auf den Computer des Clients hat, wird ihn sehen. Der Kunde kann es fälschen, wenn er es an Sie zurücksendet. Wenn dies wichtig ist, behalten Sie die vertraulichen Daten auf dem Server und lassen Sie sie nicht verlassen.

Roman Starkov
quelle
29
ähm, CSRF ist mit POST genauso gut möglich.
AviD
5
@ Lotus Notes, es ist etwas schwieriger, aber Sie brauchen keine Art von XSS. POST-Anfragen werden ständig überall gesendet, und vergessen Sie nicht, dass die CSRF von jeder Website bezogen werden kann, XSS nicht enthalten.
AviD
18
Nein, Sie müssen jemand anderen mit Berechtigungen zum Eingeben veranlassen, im Gegensatz zu einem GET, das vom Browser stillschweigend abgerufen wird. Wenn man bedenkt, dass jedes POST-Formular mit einem überprüfbaren Quell-Hash geschützt werden sollte und es keine solchen Mittel für einen GET-Link gibt, ist Ihr Standpunkt dumm.
Kibitzer
7
Nun, Sie können allen Ihren GET-Anforderungen einen Hash hinzufügen, genauso wie Sie sie POST-Formularen hinzufügen ... Sie sollten GET jedoch immer noch nicht für Änderungen an Daten verwenden.
Eli
13
Die Verwendung von POST über GET verhindert keinerlei CSRF. Dies macht sie nur ein wenig einfacher, da es einfacher ist, Leute dazu zu bringen, eine zufällige Website zu besuchen, die Bilder von URLs zulässt, als eine Website zu besuchen, die Sie steuern (genug, um Javascript zu haben). Es <body onload="document.getElementById('a').submit()"><form id="a" action="http://example.com/delete.php" action="post"><input type="hidden" name="id" value="12"></form>ist nicht wirklich schwer, irgendwo automatisch einen Beitrag einzureichen, indem man auf einen Link klickt (der diesen HTML-
Code
175

Sie haben keine größere Sicherheit, da die Variablen über HTTP POST gesendet werden als bei Variablen, die über HTTP GET gesendet werden.

HTTP / 1.1 bietet uns eine Reihe von Methoden zum Senden einer Anfrage :

  • OPTIONEN
  • ERHALTEN
  • KOPF
  • POST
  • STELLEN
  • LÖSCHEN
  • SPUR
  • VERBINDEN

Nehmen wir an, Sie haben das folgende HTML-Dokument mit GET:

<html>
<body>
<form action="http://example.com" method="get">
    User: <input type="text" name="username" /><br/>
    Password: <input type="password" name="password" /><br/>
    <input type="hidden" name="extra" value="lolcatz" />
    <input type="submit"/>
</form>
</body>
</html>

Was fragt Ihr Browser? Es fragt dies:

 GET /?username=swordfish&password=hunter2&extra=lolcatz HTTP/1.1
 Host: example.com
 Connection: keep-alive
 Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/ [...truncated]
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) [...truncated]
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

Stellen wir uns nun vor, wir hätten diese Anforderungsmethode in einen POST geändert:

 POST / HTTP/1.1
 Host: example.com
 Connection: keep-alive
 Content-Length: 49
 Cache-Control: max-age=0
 Origin: null
 Content-Type: application/x-www-form-urlencoded
 Accept: application/xml,application/xhtml+xml,text/ [...truncated]
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; [...truncated]
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

 username=swordfish&password=hunter2&extra=lolcatz

BEIDE dieser HTTP-Anforderungen sind:

  • Nicht verschlüsselt
  • In beiden Beispielen enthalten
  • Kann evakuiert werden und MITM-Angriffen ausgesetzt sein.
  • Einfache Reproduktion durch Dritte und Skript-Bots.

Viele Browser unterstützen keine anderen HTTP-Methoden als POST / GET.

Viele Browser Seitenadresse gespeichert. Dies bedeutet jedoch nicht, dass Sie eines dieser anderen Probleme ignorieren können.

Um genau zu sein:

Ist einer von Natur aus sicherer als der andere? Mir ist klar, dass POST keine Informationen in der URL preisgibt, aber gibt es einen wirklichen Wert darin oder ist es nur Sicherheit durch Dunkelheit? Was ist hier die beste Vorgehensweise?

Dies ist richtig, da die Software, mit der Sie HTTP sprechen, dazu neigt, die Anforderungsvariablen mit einer Methode zu speichern, aber nicht mit einer anderen Methode verhindert, dass jemand Ihren Browserverlauf oder einen anderen naiven Angriff eines 10-Jährigen betrachtet, der glaubt, h4x0r1ng zu verstehen oder Skripte, die Ihren Verlaufsspeicher überprüfen. Wenn Sie ein Skript haben, mit dem Sie Ihren Verlaufsspeicher überprüfen können, können Sie auch ein Skript verwenden, das Ihren Netzwerkverkehr überprüft. Diese gesamte Sicherheit durch Dunkelheit bietet also nur Skriptkindern und eifersüchtigen Freundinnen Dunkelheit.

Über https werden POST-Daten verschlüsselt, aber könnten URLs von einem Drittanbieter abgehört werden?

So funktioniert SSL Erinnerst du dich an die beiden Anfragen, die ich oben gesendet habe? So sehen sie in SSL aus: (Ich habe die Seite in https://encrypted.google.com/ geändert, da example.com nicht auf SSL reagiert.)

POST über SSL

q5XQP%RWCd2u#o/T9oiOyR2_YO?yo/3#tR_G7 2_RO8w?FoaObi)
oXpB_y?oO4q?`2o?O4G5D12Aovo?C@?/P/oOEQC5v?vai /%0Odo
QVw#6eoGXBF_o?/u0_F!_1a0A?Q b%TFyS@Or1SR/O/o/_@5o&_o
9q1/?q$7yOAXOD5sc$H`BECo1w/`4?)f!%geOOF/!/#Of_f&AEI#
yvv/wu_b5?/o d9O?VOVOFHwRO/pO/OSv_/8/9o6b0FGOH61O?ti
/i7b?!_o8u%RS/Doai%/Be/d4$0sv_%YD2_/EOAO/C?vv/%X!T?R
_o_2yoBP)orw7H_yQsXOhoVUo49itare#cA?/c)I7R?YCsg ??c'
(_!(0u)o4eIis/S8Oo8_BDueC?1uUO%ooOI_o8WaoO/ x?B?oO@&
Pw?os9Od!c?/$3bWWeIrd_?( `P_C?7_g5O(ob(go?&/ooRxR'u/
T/yO3dS&??hIOB/?/OI?$oH2_?c_?OsD//0/_s%r

GET über SSL

rV/O8ow1pc`?058/8OS_Qy/$7oSsU'qoo#vCbOO`vt?yFo_?EYif)
43`I/WOP_8oH0%3OqP_h/cBO&24?'?o_4`scooPSOVWYSV?H?pV!i
?78cU!_b5h'/b2coWD?/43Tu?153pI/9?R8!_Od"(//O_a#t8x?__
bb3D?05Dh/PrS6_/&5p@V f $)/xvxfgO'q@y&e&S0rB3D/Y_/fO?
_'woRbOV?_!yxSOdwo1G1?8d_p?4fo81VS3sAOvO/Db/br)f4fOxt
_Qs3EO/?2O/TOo_8p82FOt/hO?X_P3o"OVQO_?Ww_dr"'DxHwo//P
oEfGtt/_o)5RgoGqui&AXEq/oXv&//?%/6_?/x_OTgOEE%v (u(?/
t7DX1O8oD?fVObiooi'8)so?o??`o"FyVOByY_ Supo? /'i?Oi"4
tr'9/o_7too7q?c2Pv

(Hinweis: Ich habe das HEX in ASCII konvertiert, einige davon sollten offensichtlich nicht anzeigbar sein.)

Die gesamte HTTP-Konversation ist verschlüsselt. Der einzige sichtbare Teil der Kommunikation befindet sich auf der TCP / IP-Schicht (dh der IP-Adresse und den Verbindungsportinformationen).

Lassen Sie mich hier eine große kühne Aussage machen. Ihre Website bietet keine größere Sicherheit für eine HTTP-Methode als für eine andere. Hacker und Neulinge auf der ganzen Welt wissen genau, wie das zu tun ist, was ich gerade hier demonstriert habe. Wenn Sie Sicherheit wünschen, verwenden Sie SSL. Browser neigen dazu, den Verlauf zu speichern. Es wird von RFC2616 9.1.1 empfohlen, GET NICHT zum Ausführen einer Aktion zu verwenden, aber zu glauben, dass POST Sicherheit bietet, ist völlig falsch.

Das einzige, was POST ist eine Sicherheitsmaßnahme? Schutz vor Ihrem eifersüchtigen Ex, der Ihren Browserverlauf durchblättert. Das ist es. Der Rest der Welt ist in Ihrem Konto angemeldet und lacht über Sie.

Um weiter zu demonstrieren, warum POST nicht sicher ist, verwendet Facebook überall POST-Anfragen. Wie kann also Software wie FireSheep existieren?

Beachten Sie, dass Sie möglicherweise mit CSRF angegriffen werden, auch wenn Sie HTTPS verwenden und Ihre Site keine XSS- Schwachstellen enthält. Kurz gesagt, in diesem Angriffsszenario wird davon ausgegangen, dass das Opfer (der Benutzer Ihrer Website oder Ihres Dienstes) bereits angemeldet ist und über ein ordnungsgemäßes Cookie verfügt. Anschließend wird der Browser des Opfers aufgefordert, etwas mit Ihrer (angeblich sicheren) Website zu tun. Wenn Sie keinen Schutz gegen CSRF haben, kann der Angreifer weiterhin Aktionen mit den Anmeldeinformationen des Opfers ausführen. Der Angreifer kann die Serverantwort nicht sehen, da sie an den Browser des Opfers übertragen wird, aber der Schaden ist normalerweise bereits zu diesem Zeitpunkt angerichtet.

Inkognito
quelle
1
Schade, dass du nicht über CSRF gesprochen hast :-). Gibt es eine Möglichkeit, Sie zu kontaktieren?
Florian Margaine
@FlorianMargaine Füge mich auf Twitter hinzu und ich werde dir meine E-Mail schicken. twitter.com/#!/BrianJGraham
Incognito
Wer hat gesagt, dass Facebook sicher ist? Gute Antwort. +1.
Amal Murali
1
"[...] also bietet diese gesamte Sicherheit durch Dunkelheit nur Drehbuchkindern und eifersüchtigen Freundinnen Dunkelheit. [...]". Dies hängt ganz von den Fähigkeiten der eifersüchtigen Freundin ab. Darüber hinaus sollte kein gf / bf Ihren Browserverlauf besuchen dürfen. je. lol.
Turkishweb
34

Es gibt keine zusätzliche Sicherheit.

Post-Daten werden nicht in den Verlaufs- und / oder Protokolldateien angezeigt. Wenn die Daten jedoch sicher aufbewahrt werden sollen, benötigen Sie SSL.
Andernfalls kann jeder, der an der Leitung schnüffelt, Ihre Daten trotzdem lesen.

Jacco
quelle
2
Wenn Sie eine URL über SSL erhalten, kann ein Dritter die URL nicht sehen, daher ist die Sicherheit dieselbe
davetron5000
7
GET-Informationen können nur am Anfang und Ende des SSL-Tunnels
angezeigt werden
1
Und die Systemadministratoren, wenn sie die Protokolldateien durchsuchen.
Tomalak
1
Ich würde sagen , es gibt einige zusätzliche Sicherheit, dass POST - Daten werden nicht in dem Browser des Benutzers Geschichte gespeichert werden, aber GET Daten.
Kip
3
HTTP über SSL / TLS (korrekt implementiert) ermöglicht es dem Angreifer, an der Leitung zu schnüffeln (oder aktiv zu manipulieren), nur zwei Dinge zu sehen - die IP-Adresse des Ziels und die Datenmenge, die in beide Richtungen geht.
Aaron
29

Auch wenn sich für Anmeldeformulare oder andere Formulare mit relativ vertraulichen Informationen POSTkein wirklicher Sicherheitsvorteil ergibt GET, stellen Sie sicher, dass Sie Folgendes verwenden POST:

  1. Die Informationen POSTwerden nicht im Benutzerverlauf gespeichert.
  2. Die im Formular gesendeten vertraulichen Informationen (Kennwort usw.) werden später in der URL-Leiste nicht mehr angezeigt (bei Verwendung GETwerden sie im Verlauf und in der URL-Leiste angezeigt).

Auch GEThat eine theoretische Grenze von Daten. POSTnicht.

Verwenden Sie für wirklich vertrauliche Informationen unbedingt SSL( HTTPS)

Andrew Moore
quelle
In den Standardeinstellungen werden Sie jedes Mal, wenn ich in Firefox / IE einen Benutzernamen und ein Kennwort eingebe, gefragt, ob ich diese Informationen speichern möchte, damit ich sie später nicht eingeben muss.
Kibbee
Andrew Ich denke, er meint die automatische Vervollständigung von Benutzereingabefeldern. Beispielsweise merkt sich Firefox alle Daten, die ich auf meiner Website eingegeben habe. Wenn ich also anfange, Text in ein Suchfeld einzugeben, wird angeboten, den Text mit meinen vorherigen Suchvorgängen zu vervollständigen.
James McMahon
Ja, das ist der Punkt der automatischen Vervollständigung, nicht wahr? Was ich meinte, war die eigentliche Geschichte, nicht automatisch zu vervollständigen.
Andrew Moore
Wenn der Angreifer auf den vollständigen Browserverlauf zugreifen kann, hat er auch Zugriff auf die vollständigen Daten zur automatischen Vervollständigung des Browsers.
Mikko Rantalainen
19

Keiner von GET und POST ist von Natur aus "sicherer" als der andere, genauso wie keiner von Fax und Telefon "sicherer" als der andere ist. Die verschiedenen HTTP-Methoden werden bereitgestellt, damit Sie diejenige auswählen können, die für das Problem, das Sie lösen möchten, am besten geeignet ist. GET ist besser geeignet für idempotente Abfragen, während POST für "Aktions" -Abfragen besser geeignet ist. Sie können sich jedoch mit jeder dieser Abfragen genauso leicht in den Fuß schießen, wenn Sie die Sicherheitsarchitektur für die von Ihnen verwaltete Anwendung nicht verstehen.

Es ist wahrscheinlich am besten, wenn Sie Kapitel 9: Methodendefinitionen des HTTP / 1.1-RFC lesen , um eine allgemeine Vorstellung davon zu erhalten, was GET und POST ursprünglich nicht bedeuten sollten.

Mihai Limbășan
quelle
16

Der Unterschied zwischen GET und POST sollte nicht in Bezug auf die Sicherheit gesehen werden, sondern in Bezug auf ihre Absichten gegenüber dem Server. GET sollte niemals Daten auf dem Server ändern - zumindest nicht in Protokollen -, aber POST kann neue Ressourcen erstellen.

Nette Proxys werden POST-Daten nicht zwischenspeichern, aber sie können GET-Daten von der URL zwischenspeichern, sodass Sie sagen können, dass POST sicherer sein soll. POST-Daten stehen jedoch weiterhin Proxys zur Verfügung, die nicht gut funktionieren.

Wie in vielen Antworten erwähnt, ist die einzig sichere Wette SSL.

Stellen Sie jedoch sicher, dass die GET-Methoden keine Änderungen festschreiben, z. B. das Löschen von Datenbankzeilen usw.

Ruquay
quelle
1
Ich stimme dem zu. Die Frage ist nicht die Sicherheit, sondern das, wofür POST und GET entwickelt wurden.
pbreitenbach
6

Meine übliche Methode zur Auswahl ist wie folgt:

  • GET für Elemente, die später per URL abgerufen werden
    • ZB sollte die Suche GET sein, damit Sie später search.php? S = XXX ausführen können
  • POST für Artikel, die gesendet werden
    • Dies ist im Vergleich zu GET relativ unsichtbar und schwieriger zu senden, aber Daten können weiterhin über cURL gesendet werden.
Ross
quelle
Es ist jedoch schwieriger, einen POST als einen GET durchzuführen. Ein GET ist nur eine URL im Adressfeld. Ein POST erfordert ein <Formular> in einer HTML-Seite oder einer cURL.
pbreitenbach
2
Ein gefälschter Beitrag benötigt also Notizblock und 5 Minuten Zeit ... nicht wirklich viel schwieriger. Ich habe den Editor verwendet, um einem nicht vorhandenen Telefonsystem Funktionen hinzuzufügen. Ich konnte eine Kopie der Administrationsformulare für das System erstellen, mit der ich Schaltflächen Befehle zuweisen konnte, die für den Anbieter "nicht möglich" waren.
Matthew Whited
6

Dies ist nicht sicherheitsrelevant, aber ... Browser speichern keine POST-Anforderungen zwischen .

Daniel Silveira
quelle
6

Keiner von beiden verleiht einer Anfrage auf magische Weise Sicherheit, GET impliziert jedoch einige Nebenwirkungen, die im Allgemeinen verhindern, dass sie sicher ist.

GET-URLs werden im Browserverlauf und in den Webserver-Protokollen angezeigt. Aus diesem Grund sollten sie niemals für Anmeldeformulare und Kreditkartennummern verwendet werden.

Das bloße POSTEN dieser Daten macht sie jedoch auch nicht sicher. Dafür möchten Sie SSL. Sowohl GET als auch POST senden Daten im Klartext über das Kabel, wenn sie über HTTP verwendet werden.

Es gibt auch andere gute Gründe, Daten zu POSTEN - wie die Möglichkeit, unbegrenzte Datenmengen zu übermitteln oder Parameter vor Gelegenheitsbenutzern zu verbergen.

Der Nachteil ist, dass Benutzer die Ergebnisse einer über POST gesendeten Abfrage nicht mit einem Lesezeichen versehen können. Dafür brauchen Sie GET.

edebill
quelle
5

Betrachten Sie diese Situation: Eine schlampige API akzeptiert GET-Anforderungen wie:

http://www.example.com/api?apikey=abcdef123456&action=deleteCategory&id=1

Wenn Sie in einigen Einstellungen diese URL anfordern und ein Fehler / eine Warnung bezüglich der Anforderung auftritt, wird diese gesamte Zeile in der Protokolldatei protokolliert. Schlimmer noch: Wenn Sie vergessen, Fehlermeldungen auf dem Produktionsserver zu deaktivieren, werden diese Informationen nur im Browser angezeigt! Jetzt haben Sie gerade Ihren API-Schlüssel an alle weitergegeben.

Leider gibt es echte APIs, die auf diese Weise funktionieren.

Ich möchte nicht, dass vertrauliche Informationen in den Protokollen enthalten sind oder im Browser angezeigt werden. POST und GET sind nicht dasselbe. Verwenden Sie sie gegebenenfalls.

Halil Özgür
quelle
3
  1. SICHERHEIT als Sicherheit von Daten IN TRANSIT: kein Unterschied zwischen POST und GET.

  2. SICHERHEIT als Sicherheit von Daten AUF DEM COMPUTER: POST ist sicherer (kein URL-Verlauf)

Kaschmiri
quelle
2

Der Begriff Sicherheit ist bedeutungslos, es sei denn, Sie definieren, gegen was Sie sicher sein möchten.

Wenn Sie gegen gespeicherten Browserverlauf, einige Arten der Protokollierung und Personen, die Ihre URLs anzeigen, sicher sein möchten, ist POST sicherer.

Wenn Sie sicher sein möchten, dass jemand an Ihrer Netzwerkaktivität schnüffelt, gibt es keinen Unterschied.

Taymon
quelle
1

Viele Leute nehmen eine Konvention an (von Ross angedeutet), dass GET-Anforderungen nur Daten abrufen und keine Daten auf dem Server ändern, und POST-Anforderungen werden für alle Datenänderungen verwendet. Während man nicht mehr von Natur aus sicherer als die anderen ist, wenn Sie tun , diese Konvention folgen, können Sie übergreifende Sicherheitslogik anwenden (zB nur Personen mit Konten können Daten ändern, so unauthenticated Beiträge werden abgelehnt).

Eric R. Rath
quelle
4
Eigentlich ist es keine "Konvention", sondern Teil des HTTP-Standards. Der RFC zeigt sehr deutlich, was von den verschiedenen Methoden zu erwarten ist.
John Nilsson
Wenn Sie zulassen, dass GET-Anforderungen den Status ändern, kann es vorkommen, dass ein Browser, der Seiten vorab abruft, von denen er glaubt, dass Sie sie besuchen, versehentlich Aktionen ausführt, die Sie nicht wollten.
Jessta
1

Es ist schwieriger, eine POST-Anforderung zu ändern (dies erfordert mehr Aufwand als das Bearbeiten der Abfragezeichenfolge). Bearbeiten: Mit anderen Worten, es ist nur Sicherheit durch Dunkelheit, und kaum das.

Augenlidlosigkeit
quelle
3
Ich kann POST-Anforderungen genauso einfach ändern wie Abfragezeichenfolgenanforderungen, indem ich einige Add-Ons für Firefox verwende. Ich kann sogar Cookie-Daten nach Herzenslust ändern.
Stephenbayer
Es wird Script Kiddies nicht verlangsamen, es ist genau die Art von Dingen, die Script Kiddies die ganze Zeit versuchen. Das Problem ist, dass sie manchmal erfolgreich sind.
Jacco
2
Äh. Verwenden von Addons für Firefox = mehr Aufwand als Abfragezeichenfolge.
Augenlidlosigkeit
Ihre Antwort gibt den Menschen das falsche Gefühl, dass sie sicherer sind, wenn sie einen Beitrag verwenden, obwohl dies nicht der Fall ist. Schlechte Antwort, böser Mann.
Chris Marasti-Georg
Ich habe bearbeitet, um die Absicht meiner Antwort klarer zu machen. Hoffentlich hilft das.
Augenlidlosigkeit
1

Ich werde nicht alle anderen Antworten wiederholen, aber es gibt einen Aspekt, den ich noch nicht erwähnt habe - es ist die Geschichte des Verschwindens von Daten. Ich weiß nicht, wo ich es finden kann, aber ...

Im Grunde handelt es sich um eine Webanwendung, die auf mysteriöse Weise alle paar Nächte alle Daten verloren hat und niemand wusste warum. Eine spätere Überprüfung der Protokolle ergab, dass die Website von Google oder einer anderen beliebigen Spinne gefunden wurde, die alle auf der Website gefundenen Links - einschließlich "Diesen Eintrag löschen" und "Sind Sie sicher?" Links.

Eigentlich - ein Teil davon wurde erwähnt. Dies ist die Geschichte hinter "Ändern Sie keine Daten in GET, sondern nur in POST". Crawler werden GET gerne folgen, niemals POST. Selbst robots.txt hilft nicht gegen schlecht benommene Crawler.

Olaf Kock
quelle
1

Sie sollten sich auch darüber im Klaren sein, dass, wenn Ihre Websites Links zu anderen externen Websites enthalten, die Sie nicht mit GET steuern, diese Daten in den Header des Empfängers auf den externen Websites eingefügt werden, wenn diese auf die Links auf Ihrer Website klicken. Das Übertragen von Anmeldedaten über GET-Methoden ist daher IMMER ein großes Problem. Da dies möglicherweise Anmeldeinformationen für den einfachen Zugriff verfügbar macht, indem Sie nur die Protokolle überprüfen oder in Google Analytics (oder ähnlichem) suchen.

3cho
quelle
1

RFC7231:

"URIs sollen gemeinsam genutzt und nicht gesichert werden, selbst wenn sie sichere Ressourcen identifizieren. URIs werden häufig auf Displays angezeigt, beim Drucken einer Seite zu Vorlagen hinzugefügt und in einer Vielzahl ungeschützter Lesezeichenlisten gespeichert. Es ist daher nicht ratsam, sie einzuschließen Informationen innerhalb einer URI, die sensibel, persönlich identifizierbar oder offen zu legen sind.

Autoren von Diensten sollten GET-basierte Formulare für die Übermittlung sensibler Daten vermeiden, da diese Daten in das Anforderungsziel gestellt werden. Viele vorhandene Server, Proxys und Benutzeragenten protokollieren oder zeigen das Anforderungsziel an Stellen an, an denen es für Dritte sichtbar sein könnte. Solche Dienste sollten stattdessen die POST-basierte Formularübermittlung verwenden. "

Dieser RFC besagt eindeutig, dass sensible Daten nicht mit GET übermittelt werden sollten. Aufgrund dieser Bemerkung behandeln einige Implementierer Daten, die aus dem Abfrageteil einer GET-Anforderung stammen, möglicherweise nicht mit der gleichen Sorgfalt. Ich arbeite selbst an einem Protokoll, das die Integrität der Daten gewährleistet. Nach dieser Spezifikation sollte ich die Integrität der GET-Daten nicht garantieren müssen (was ich tun werde, weil niemand diese Spezifikationen einhält).

Silber
quelle
1

Wie bereits einige Leute gesagt haben, bringt HTTPS Sicherheit.

POST ist jedoch etwas sicherer als GET, da GET im Verlauf gespeichert werden kann.

Leider ist die Wahl von POST oder GET manchmal nicht Sache des Entwicklers. Zum Beispiel wird ein Hyperlink immer per GET gesendet (es sei denn, er wird mit Javascript in ein Post-Formular umgewandelt).

Magallane
quelle
0

GET ist für jeden sichtbar (auch für den, der sich gerade auf Ihrer Schulter befindet) und wird im Cache gespeichert. Daher ist die Verwendung von Post weniger sicher. Übrigens ist Post ohne Kryptografieroutine nicht sicher. Für ein wenig Sicherheit müssen Sie SSL verwenden ( https)

Kentaromiura
quelle
0

Ein Grund, warum POST aus Sicherheitsgründen schlechter ist, besteht darin, dass GET standardmäßig mit Parametern und allen Daten von Ihrem Webserver fast universell protokolliert wird.

POST ist das Gegenteil , es wird fast überall nicht protokolliert , was zu sehr schwer zu erkennenden Angreiferaktivitäten führt.

Ich kaufe nicht das Argument „es ist zu groß“, die kein Grund, nicht melden Sie sich etwas , zumindest 1 KB, würde einen langen Weg für die Menschen Angreifer arbeiten weg an einem schwachen Eingangspunkt zu identifizieren , bis es den Pop, dann POST tut Ein doppelter Dis-Service, bei dem jede HTTP-basierte Hintertür unbegrenzt Datenmengen unbeaufsichtigt weitergeben kann.

RandomNickName42
quelle
0

Der Unterschied besteht darin, dass GET Daten offen und POST ausgeblendet sendet (im http-Header).

Get ist also besser für nicht sichere Daten wie Abfragezeichenfolgen in Google. Auth-Daten dürfen niemals über GET gesendet werden - verwenden Sie also POST hier. Natürlich ist das ganze Thema etwas komplizierter. Wenn Sie mehr lesen möchten, lesen Sie diesen Artikel .

Daniel
quelle
0

Kürzlich wurde ein Angriff veröffentlicht, der es einem Mann in der Mitte ermöglicht, den Anforderungskörper komprimierter HTTPS-Anforderungen anzuzeigen. Da Anforderungsheader und URL nicht durch HTTP komprimiert werden, sind GET-Anforderungen besser gegen diesen bestimmten Angriff geschützt.

Es gibt Modi, in denen GET-Anforderungen ebenfalls anfällig sind. SPDY komprimiert Anforderungsheader. TLS bietet auch eine optionale (selten verwendete) Komprimierung. In diesen Szenarien ist der Angriff leichter zu verhindern (Browser-Anbieter haben bereits Korrekturen bereitgestellt). Die Komprimierung auf HTTP-Ebene ist eine grundlegendere Funktion. Es ist unwahrscheinlich, dass Anbieter sie deaktivieren.

Es ist nur ein Beispiel, das ein Szenario zeigt, in dem GET sicherer als POST ist, aber ich denke nicht, dass es eine gute Idee wäre, aus diesem Angriffsgrund GET anstelle von POST zu wählen. Der Angriff ist ziemlich raffiniert und erfordert nicht triviale Voraussetzungen (Angreifer müssen in der Lage sein, einen Teil des Anforderungsinhalts zu kontrollieren). Es ist besser, die HTTP-Komprimierung in Szenarien zu deaktivieren, in denen der Angriff schädlich wäre.

Jan Wrobel
quelle
0

Haftungsausschluss: Die folgenden Punkte gelten nur für API-Aufrufe und nicht für die Website-URLs.

Sicherheit über das Netzwerk : Sie müssen HTTPS verwenden. GET und POST sind in diesem Fall gleichermaßen sicher.

Browserverlauf : Für Front-End-Anwendungen wie Angular JS, React JS usw. sind API-Aufrufe AJAX-Aufrufe des Frontends. Diese werden nicht Teil des Browserverlaufs. Daher sind POST und GET gleichermaßen sicher.

Serverseitige Protokolle : Mit dem Schreibsatz-Format für Datenmaskierung und Zugriffsprotokolle können alle oder nur vertrauliche Daten vor der Anforderungs-URL ausgeblendet werden.

Datensichtbarkeit in der Browserkonsole: Für jemanden mit böswilliger Absicht ist es fast das gleiche Bestreben, POST-Daten genauso anzuzeigen wie GET.

Daher ist die GET-API mit den richtigen Protokollierungsmethoden genauso sicher wie die POST-API. Wenn Sie POST überall folgen, werden schlechte API-Definitionen erzwungen und sollten vermieden werden.

Kishor Borat
quelle
-2

Post ist zusammen mit installiertem SSL am sichersten, da es im Nachrichtentext übertragen wird.

Alle diese Methoden sind jedoch unsicher, da das darunter verwendete 7-Bit-Protokoll mit Hemmung gehackt werden kann. Auch durch eine Level 4 Webanwendungs-Firewall.

Steckdosen sind auch keine Garantie ... Auch wenn sie in gewisser Weise sicherer sind.

drtechno
quelle
-3

Dies ist ein alter Beitrag, aber ich möchte einige der Antworten ablehnen. Wenn Sie vertrauliche Daten übertragen, möchten Sie SSL verwenden. Wenn Sie SSL mit einem GET-Parameter verwenden (z. B.? Userid = 123), werden diese Daten im Klartext gesendet! Wenn Sie mit einem POST senden, werden die Werte in den verschlüsselten Nachrichtentext eingefügt und sind daher für die meisten MITM-Angriffe nicht lesbar.

Der große Unterschied besteht darin, wo die Daten weitergegeben werden. Es ist nur sinnvoll, dass die Daten, wenn sie in einer URL gespeichert sind, NICHT verschlüsselt werden können, da Sie sonst nicht zum Server weiterleiten können, da nur Sie die URL lesen können. So funktioniert ein GET.

Kurz gesagt, Sie können Daten in einem POST sicher über SSL übertragen, aber Sie können dies nicht mit einem GET tun, ob Sie SSL verwenden oder nicht.

LVM
quelle
4
Das ist völlig falsch. SSL ist ein Transportschichtprotokoll. Es stellt ZUERST eine Verbindung zum Server her und sendet dann ALLE Anwendungsdaten als verschlüsselten binären Datenstrom. Schauen Sie sich diesen Thread an: answers.google.com/answers/threadview/id/758002.html
Simeon G
Wenn Sie einen TCPDump durchführen, werden Sie feststellen, dass dies zu 100% der Fall ist. Um eine Verbindung zum Server herzustellen, müssen Sie Ihre Anfrage unverschlüsselt senden. Wenn Sie dies als GET tun, werden Ihre Argumente zur ursprünglichen Anforderung hinzugefügt und sind daher unverschlüsselt. Unabhängig davon, was Sie in dem von Ihnen verlinkten Beitrag sehen, können Sie dies mit TCPDump (oder ähnlichem) testen.
LVM
1
Getan! Ich habe gerade tcpdump auf meinem Mac ausgeführt. Und Ihre Antwort war zu 100% falsch. Hier ist der Befehl, den ich verwendet habe: sudo tcpdump -w ssl.data -A -i en1 -n dst port 443 Als ich dann in ssl.data nachgesehen habe, habe ich natürlich Gobly Gook gesehen. Alle HTTP-Daten wurden verschlüsselt. Und um sicherzustellen, dass ein normaler Nicht-SSL-Aufruf funktioniert, habe ich Folgendes verwendet: sudo tcpdump -w clear.data -A -i en1 -n dst Port 80 Und natürlich hatte ich in clear.data alle Header und URIs im Clear angezeigt . Ich habe dies auf Google Mail und Google Plus (HTTPS) sowie auf einigen Nicht-SSL-Seiten wie google.com getestet.
Simeon G
Ich bin kein Netzwerkexperte. Wenn Sie also glauben, dass ich auf tcpdump die falschen Befehle verwendet habe, können Sie mich gerne korrigieren.
Simeon G
Ich habe den Befehl nicht ohne weiteres, aber Sie können ihn auch mit Wireshark / Ethereal überprüfen.
LVM
-3

Sogar POST akzeptiert GET-Anfragen. Angenommen, Sie haben ein Formular mit Eingaben wie user.name und user.passwd, die Benutzername und Kennwort unterstützen sollen. Wenn wir einfach einen? User.name = "mein Benutzer & user.passwd =" mein Passwort "hinzufügen, wird die Anfrage durch" Umgehen der Anmeldeseite "akzeptiert.

Eine Lösung hierfür besteht darin, Filter (Java-Filter als e) auf der Serverseite zu implementieren und zu erkennen, dass keine Zeichenfolgenabfragen als GET-Argumente übergeben werden.

Sabre Chebka
quelle
2
Nicht wahr! Dies hängt ganz von Ihrem Backend ab, ob Code, der POSTs akzeptiert, auch GETs akzeptiert.
Colin 't Hart