Sollte ich GET oder POST verwenden beim anfordern von sensiblen Daten?
Sollte ich GET
oder POST
für das abrufen sensibler Daten, da:
- Die Antwort enthält sensible Daten.
- Es gibt Nebenwirkungen auf die Anfrage (wie explizite Rechenschaftspflicht der Protokollierung).
Den RFC 2616, für mich, nicht das für mich aufklären:
Natürlich, es ist nicht möglich, um sicherzustellen, dass der server nicht erzeugen Nebenwirkungen, die als Ergebnis der Durchführung einer
GET
Anfrage; in der Tat, einige dynamische Ressourcen berücksichtigen, dass ein feature. Der wichtige Unterschied hier ist, dass der Benutzer nicht angefordert hast, die Nebenwirkungen, also kann deshalb nicht zur Rechenschaft gezogen werden für Sie. [...]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Schritt zurück
Zunächst die RFC 2616 ist veraltet. Daher sollte es nicht verwendet werden, weil ein Verweis nicht mehr.
Nachfolgend finden Sie den aktuellen Referenzen für die HTTP/1.1-Protokoll:
Die sichere Eigenschaft
Haben Sie einen Blick auf, was die RFC 7231 sagt über sichere Methoden:
Im Kontext von HTTP-Methoden, sicher ist nicht im Zusammenhang mit Sicherheit und, in ähnlicher Weise, sicher nicht über den Umgang mit sensiblen Daten. Sicher bedeutet nur-lese -.
Wird, wie oben angegeben, die Verwendung von sicheren Methoden nicht verhindern, dass Sie die Durchführung von Operationen, die nicht schreibgeschützt sind, wie z.B. das protokollieren der Anforderung einer Datei. Allerdings, diese Vorgänge sollten für den Kunden transparent.
Welche Methode sollten Sie verwenden?
Kommt es auf den Vorgang, den Sie ausführen. In REST-APIs, die
POST
Methode wird Häufig verwendet, um Ressourcen anzulegen, während dieGET
Methode wird Häufig verwendet, um Anfrage eine Repräsentation einer Ressource.Und wie Sie über Sicherheit und sensible Daten?
Wenn Sie wollen, um sicherzustellen, Sicherheit beim Versand sensibler Daten über den Draht, verwenden Sie HTTPS und don ' T setzen Sie sensible Daten (wie Passwörter) in der URL.
Neben Cássio Mazzochi Molin ausgezeichnete Antwort, sollten Sie HTTPS verwenden, aber Sie sollten (in der Regel) Verwendung:
Den Grund zu verwenden, ERHALTEN Sie beim abrufen ist, dass die Aktion nicht haben Nebenwirkungen, daher gibt es keinen Grund, POST. Die einzige bisher gültigen Grund zu verwenden, wurde der POST beim abrufen von JSON über AJAX, da alte Browser hatten bugs, die Bedeutung, die einer anderen Domäne, die der Benutzer im browser öffnen könnte stehlen die Daten aus dem JSON mit einem
<script>
tag (JSON-Hijacking). Das Verbot BEKOMMEN, verhindert dieser Angriff, weil<script src="...">
immer die GET-Methode verwendet. Sehen diese Antwort. Beachten Sie, dass die Verwendung von POST-bedeutet hier sollten Sie deaktivieren, BEKOMME die server-Seite für diese Methode.Der Grund für die Verwendung der POST für den Versand sensibler Daten ist, dass es verhindert Datenlecks über den query-string (auch wenn ein anderer Weg wäre, um benutzerdefinierte Header gesetzt, obwohl die POST macht viel mehr Sinn). Der Grund dafür ist, dass die Abfrage-Zeichenfolge-Daten in der URL wird protokolliert, von proxy-Servern, server-logs als Standard, und kann auch gespeichert werden in der browser-history, so dass es nicht ein großartiger Ort, um zu übermitteln personenbezogene oder anderweitig sensible Daten. Beachten Sie, dass während der übertragung über HTTPS, Sie würden verschlüsselt sein, es ist nur, dass Sie austreten kann aus der verschlüsselten Zustand auf andere, nicht-verschlüsselt oder nicht-kontrollierten Standorten befinden. Natürlich, geht zurück auf RFC 7231, wenn Sie änderungen auf dieser Basis versendet sensible Daten, die POST ist die bessere Idee, da es sonst verhindern, dass der browser versehentlich Sie es erneut zu senden in den meisten Fällen.
Ich würde vorschlagen, mit der POST, nicht für jeden wirklichen technischen Grund, wie Nebenwirkungen, aber eher weil die Server oft so konfiguriert Uhr POST-Anrufe mehr, und viele off-the-shelf-security-Module betrachten Sie den BEITRAG als der Ort, wo die action passiert.
Das ist nicht wirklich einen großen technischen Grund, aber ich wäre daran interessiert zu sehen, was andere denken.
Sollten Sie nutzen, die zum abrufen der Informationen vom server.
Auditing-und logging-würde nicht als Nebenwirkungen, da Sie für den client transparent.
Sicherung der response-Daten erfolgt über SSL und "Cache-control: no-store". Sobald die sensiblen Daten bekommt der Kunde, es gibt keinen Weg, Sie zu stoppen tun, was Sie wollen mit ihm.
Über POST würde nur dann Sinn machen, als Teil einer Anwendung, die entworfen ist, um zu verhindern, dass ein Benutzer herabzumindern Erhalt der Antwort. Ich kenne keine solchen Regelungen, und ich würde nicht Gefahr zu entwickeln, eine aus der Spitze von meinem Kopf.
Die Absicht, die Anfragen des Benutzers nicht um ein audit-log-Eintrag; die Absicht ist die Antwort. Die Verantwortlichkeit log ist ein Nebeneffekt, aber es ist verborgen vor dem Benutzer, so ein POST ist nicht erforderlich.
In anderen Worten, Sie können nicht halten die Nutzer die Verantwortung für immer die Daten, weil Sie nicht beweisen können Sie es erhalten. Aber zu wissen, wer die Daten angefordert hat, könnte helfen, eine Untersuchung, sodass die Aufzeichnung es als Nebenwirkung ist immer noch nützlich.
Wenn die Daten sehr empfindlich sind, sollten Sie erwägen, ein POST. Es ist einfach zu Thema, eine GET-Anforderung ohne viel zu denken - zum Beispiel, wenn jemand ist auf der Suche in log-Datei, während Sie eingeloggt sind, um die Anwendung mit entsprechenden Berechtigungen und Sie auf einen link klicken, die Sie erzeugen würde, wird eine get-Anforderung.
Stattdessen können Sie den Kunden bitten, zu konstruieren, ein Dokument, das Sie nennen könnte, eine "sensible data access request". Potenziell könnten Sie benötigen ein Feld mit dem Grund für die Suche auf diese Daten. Der server erhält diese Anfrage und senden Sie die vertraulichen Daten in der Antwort.
Je nach Typ der client-Anwendung, die die Benutzer Zugriff haben, es könnte sein, viel einfacher, um zu demonstrieren, Intentionalität, wenn ein Benutzer sendet eine POST-Anfrage, als wenn Sie eine GET-Anforderung senden.