Ist eine HTTPS-Abfragezeichenfolge sicher?

351

Ich erstelle eine sichere webbasierte API, die HTTPS verwendet. Wenn ich den Benutzern jedoch erlaube, es mithilfe einer Abfragezeichenfolge zu konfigurieren (einschließlich des Sendens eines Kennworts), ist dies auch sicher, oder sollte ich erzwingen, dass dies über einen POST erfolgt?

John
quelle

Antworten:

453

Ja, so ist es. Die Verwendung von GET für vertrauliche Daten ist jedoch aus mehreren Gründen eine schlechte Idee :

  • Meistens HTTP-Referrer-Leck (ein externes Image auf der Zielseite kann das Passwort verlieren [1])
  • Das Passwort wird in Serverprotokollen gespeichert (was offensichtlich schlecht ist).
  • Verlaufs-Caches in Browsern

Obwohl Querystring gesichert ist, wird daher nicht empfohlen, vertrauliche Daten über Querystring zu übertragen.

[1] Obwohl ich beachten muss, dass RFC angibt, dass der Browser keine Verweise von HTTPS an HTTP senden soll. Dies bedeutet jedoch nicht, dass eine schlechte Browser-Symbolleiste eines Drittanbieters oder ein externes Bild / Flash von einer HTTPS-Site nicht durchgesickert ist.

dr. böse
quelle
4
Was ist mit https zu https Referrern? Wenn ich mit https ein Bild von einer Website eines Drittanbieters erhalte? Sendet der Browser die gesamte Abfragezeichenfolge aus meiner vorherigen Anfrage an den Server eines Drittanbieters?
Jus12
4
@ Jus12 ja das wird es, es macht keinen Sinn aber so ist es gestaltet.
dr. böse
2
Warum wird diese OAuth2-Spezifikation dann nicht empfohlen, vertrauliche Daten in Abfrageparametern (in der URL) zu senden? Auch wenn empfohlen wird, immer TLS (HTTPS) zu verwenden. Siehe den letzten Punkt in tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka
@ dr.evil Könnten Sie bitte näher auf das Problem eingehen History caches in browsersoder eine Referenz für ir hinzufügen?
LCJ
1
Um diese Antwort mit aktuellen Informationen zu vervollständigen: securitynewspaper.com/2016/08/01/… (Proxy-PAC-Hack ermöglicht das Abfangen von HTTPS-URLs)
Tom
78

Unter dem Gesichtspunkt "Sniff the Network Packet" ist eine GET-Anforderung sicher, da der Browser zuerst die sichere Verbindung herstellt und dann die Anforderung mit den GET-Parametern sendet. GET-URLs werden jedoch im Browserverlauf / in der automatischen Vervollständigung des Benutzers gespeichert. Dies ist kein guter Ort zum Speichern von z. B. Kennwortdaten. Dies gilt natürlich nur, wenn Sie die umfassendere Definition "Webservice" verwenden, die möglicherweise über einen Browser auf den Dienst zugreift. Wenn Sie nur über Ihre benutzerdefinierte Anwendung darauf zugreifen, sollte dies kein Problem sein.

Daher sollte die Verwendung von Post zumindest für Passwortdialoge bevorzugt werden. Wie in dem von littlegeek geposteten Link erwähnt, wird eine GET-URL eher in Ihre Serverprotokolle geschrieben.

VolkA
quelle
48

Ja , Ihre Abfragezeichenfolgen werden verschlüsselt.

Der Grund dafür ist, dass Abfragezeichenfolgen Teil des HTTP-Protokolls sind, das ein Protokoll der Anwendungsschicht ist, während der Sicherheitsteil (SSL / TLS) von der Transportschicht stammt. Zuerst wird die SSL-Verbindung hergestellt und dann werden die Abfrageparameter (die zum HTTP-Protokoll gehören) an den Server gesendet.

Beim Herstellen einer SSL-Verbindung führt Ihr Client die folgenden Schritte der Reihe nach aus. Angenommen, Sie möchten sich bei einer Site mit dem Namen example.com anmelden und Ihre Anmeldeinformationen mithilfe von Abfrageparametern senden. Ihre vollständige URL sieht möglicherweise folgendermaßen aus:

https://example.com/login?username=alice&password=12345)
  1. Ihr Client (z. B. Browser / mobile App) löst Ihren Domainnamen zunächst mithilfe einer DNS-Anfrage example.comin eine IP-Adresse (124.21.12.31)auf. Bei der Abfrage dieser Informationen werden nur domänenspezifische Informationen verwendet, dh nur example.comdiese.
  2. Jetzt versucht Ihr Client, mit der IP-Adresse eine Verbindung zum Server herzustellen, 124.21.12.31und versucht, eine Verbindung zu Port 443 herzustellen (SSL-Service-Port nicht der Standard-HTTP-Port 80).
  3. Jetzt example.comsendet der Server at seine Zertifikate an Ihren Client.
  4. Ihr Client überprüft die Zertifikate und beginnt mit dem Austausch eines gemeinsamen geheimen Schlüssels für Ihre Sitzung.
  5. Nach dem erfolgreichen Aufbau einer sicheren Verbindung werden Ihre Abfrageparameter erst dann über die sichere Verbindung gesendet.

Daher werden Sie keine sensiblen Daten verfügbar machen. Das Senden Ihrer Anmeldeinformationen über eine HTTPS-Sitzung mit dieser Methode ist jedoch nicht der beste Weg. Sie sollten einen anderen Ansatz wählen.

Ruchira Randana
quelle
2
Aber siehe die Antwort von @dr. Böse, die Steinbruchzeichenfolge kann in Protokolldateien und Caches landen, so dass sie möglicherweise nicht auf dem Server sicher ist.
Zaph
3
Hallo zaph, in Bezug auf die HTTPS-Sicherheit besteht das Ziel darin, Daten sicher an den Server zu senden, ohne dass jemand in der Mitte die Daten ausspähen kann. Während dies möglich ist und die Frage beantwortet, ist es wirklich schwierig zu steuern, was der Server danach tut. Deshalb habe ich auch erwähnt, dass dies nicht der richtige Weg ist. Außerdem sollten Sie niemals Ihr Passwort vom Client senden. Sie sollten es immer auf dem Gerät hashen und den Hashwert an den Server senden.
Ruchira Randana
Aus Sicherheitsgründen ist das Senden vertraulicher Informationen in der Steinbruchzeichenfolge nicht sicher. Es ist am besten, sie in einem POST zu senden. Außerdem wird das Kennwort im Allgemeinen auf dem Server gehasht, nicht vom Client. Die Aussage "Sie sollten niemals Ihr Passwort vom Client senden" steht im Widerspruch zur Antwort : (e.g http://example.com/login?username=alice&password=12345).
Zaph
@RuchiraRandana-Hashing auf dem Client ist sinnlos, da der private Schlüssel dann einfach vom Frontend abgerufen werden kann.
James W
@JamesW " Der private Schlüssel kann dann einfach vom Frontend abgerufen werden. " Welcher Schlüssel?
Neugieriger
28

Ja. Der gesamte Text einer HTTPS-Sitzung ist durch SSL gesichert. Dazu gehören die Abfrage und die Header. In dieser Hinsicht wären ein POST und ein GET genau gleich.

Was die Sicherheit Ihrer Methode betrifft, gibt es keine wirkliche Möglichkeit, dies ohne ordnungsgemäße Prüfung zu sagen.

shoosh
quelle
27
Sicherheit ist mehr als nur die Kommunikation zwischen Browser und Server
JoeBloggs
26

SSL stellt zuerst eine Verbindung zum Host her, sodass der Hostname und die Portnummer als Klartext übertragen werden. Wenn der Host antwortet und die Herausforderung erfolgreich ist, verschlüsselt der Client die HTTP-Anforderung mit der tatsächlichen URL (dh nach dem dritten Schrägstrich) und sendet sie an den Server.

Es gibt verschiedene Möglichkeiten, diese Sicherheit zu verletzen.

Es ist möglich, einen Proxy so zu konfigurieren, dass er als "Mann in der Mitte" fungiert. Grundsätzlich sendet der Browser die Anforderung, eine Verbindung zum realen Server herzustellen, an den Proxy. Wenn der Proxy auf diese Weise konfiguriert ist, stellt er über SSL eine Verbindung zum realen Server her, der Browser kommuniziert jedoch weiterhin mit dem Proxy. Wenn ein Angreifer also Zugriff auf den Proxy erhalten kann, kann er alle Daten, die durch den Proxy fließen, im Klartext sehen.

Ihre Anfragen werden auch im Browserverlauf angezeigt. Benutzer könnten versucht sein, die Site mit einem Lesezeichen zu versehen. Einige Benutzer haben Lesezeichen-Synchronisierungstools installiert, sodass das Kennwort möglicherweise auf deli.ci.us oder einem anderen Ort landet.

Schließlich hat möglicherweise jemand Ihren Computer gehackt und einen Tastaturlogger oder einen Bildschirmschaber installiert (und viele Viren vom Typ Trojanisches Pferd tun dies). Da das Kennwort direkt auf dem Bildschirm angezeigt wird (im Gegensatz zu "*" in einem Kennwortdialog), ist dies eine weitere Sicherheitslücke.

Fazit: Wenn es um Sicherheit geht, verlassen Sie sich immer auf den ausgetretenen Pfad. Es gibt einfach zu viel, das Sie nicht wissen, an das Sie nicht denken und das Ihnen den Hals brechen wird.

Aaron Digulla
quelle
3
"Der Browser wird weiterhin mit dem Proxy sprechen" ist nicht ganz richtig. Er muss dem Browser ein gültiges Zertifikat vorlegen, das der Proxy nur generieren kann, wenn er die Kontrolle über eine Zertifizierungsstelle hat, der der Browser vertraut.
Pieter
11

Ja, solange niemand über die Schulter auf den Monitor schaut.

Ali Afshar
quelle
13
und Ihr Browser speichert den Verlauf nicht :)
Rahul Prasad
10

Ich bin nicht mit der Aussage über [...] HTTP-Referrer-Leckage (ein externes Bild auf der Zielseite könnte das Passwort verlieren) in Sloughs Antwort einverstanden .

Der HTTP 1.1-RFC gibt explizit an :

Clients sollten ein Referer-Header-Feld NICHT in eine (nicht sichere) HTTP-Anforderung aufnehmen, wenn die verweisende Seite mit einem sicheren Protokoll übertragen wurde.

Auf jeden Fall sind Serverprotokolle und der Browserverlauf mehr als ausreichend, um keine vertraulichen Daten in die Abfragezeichenfolge aufzunehmen.

Arnout
quelle
2
Es gibt wieder das Wort "sollte". Würden Sie jeder Version jedes Browsers Ihr Passwort anvertrauen?
JoeBloggs
1
Wie genau hängt das mit GET vs POST zusammen? Wäre "jede Version jedes Browsers" sicher, wenn Sie POST über HTTPS verwenden?
Arnout
2
Außerdem empfängt die HTTPS-Webseite möglicherweise ein externes Bild über HTTPS. In diesem Fall sollte der Browser den Referer-Header enthalten und somit Ihr Passwort offenlegen ...
offenlegen
3
@Arnout: Bitte lesen Sie diesen RFC, der Ihnen sagt, was NICHT bedeuten SOLLTE : ietf.org/rfc/rfc2119.txt Es ist NICHT dasselbe wie MUSS NICHT, daher ist der von Ihnen angegebene Teil nicht wirklich relevant und Browser-Agenten enthalten möglicherweise noch einen Verweis zu HTTP.
Andy
8

Ja, von dem Moment an, in dem Sie eine HTTPS-Verbindung herstellen, ist alles sicher. Die Abfragezeichenfolge (GET) als POST wird über SSL gesendet.

Drejc
quelle
-4

Sie können das Passwort als MD5-Hash-Parameter mit etwas Salz senden. Vergleichen Sie es auf der Serverseite für die Authentifizierung.

Amareswar
quelle
11
MD5 ist keine geeignete Hash-Funktion für Passwörter.
Slawek
1
Ob gehasht oder im Klartext, es ist eine schlechte Praxis, Passwörter innerhalb von GET-Parametern zu senden. Erläuterungen finden Sie in der Antwort mit der höchsten Bewertung. Aaaand ... MD5 sollte nirgendwo mehr verwendet werden ...
Thomas
" Nicht geeignete Hash-Funktion für Passwörter " Immer noch besser als das Senden von Passwörtern im Klartext an den Server, lol
neugieriger Kerl