Frage:
Ist es eine schlechte Praxis, die GET-Methode als Login-Benutzername / Passwort für Administratoren zu verwenden?
Amirreza Nasiri
2017-01-04 08:44:27 UTC
view on stackexchange narkive permalink

Ich arbeite an Webanwendungen und wie Sie wissen, ist ein Administratorfenster in den meisten Fällen ein Muss. Wir können sehen, dass viele Webanwendungen eine spezielle Anmeldeseite für Administratoren haben, auf der es ein Formular gibt (normalerweise POST -Methode), mit dem Administratoren ihr Panel anmelden können.

Da die Feldnamen bekannt sind, kann ein Hacker versuchen, die Kennwörter zu knacken, selbst wenn einige Sicherheitsmethoden implementiert sind.

Was ist also das Problem mit einem einfachen GET -Schlüssel (as)? Benutzername) und sein Wert (als Passwort)? Warum es nicht oft verwendet wird oder zumindest in vielen Artikeln nicht empfohlen wird?

Für Administratoren werden benutzerfreundliche Anmeldeseiten nicht wirklich benötigt! In beiden Fällen werden Daten protokolliert ( GET / POST ), wenn ein MiTM-Angreifer vorhanden ist.

Bei Verwendung dieser Methode werden Felder jedoch nicht erwartet für Admins selbst. Hier ist ein Beispiel für einen PHP-Code:

"category.php": (Ein bedeutungsloser Seitenname)

  <? Phpif (isset ($ _ GET ['Meaningless_user']) && $ _GET ['bedeutungsloses_Wort'] == "etwas") {session_start (); $ _SESSION ["user"] = "test"; Header ('Ort: category.php'); // Auf dieselbe oder eine andere Seite umleiten, damit die GET-Parameter aus der URL verschwinden} else {die (); // Es wird also wie eine leere Seite sein}? >  
Sie sollten HTTPS verwenden, dann müssen Sie sich keine Sorgen um MITM machen.Wenn Sie sich nicht um Benutzerfreundlichkeit kümmern, können Sie außerdem die HTTP Basic- oder Clientzertifikatauthentifizierung implementieren. Dann müssen Sie die Authentifizierung nicht in der Webanwendung selbst implementieren.
Webserver-Protokolle und Proxy-Protokolle, Zeitraum, Hauptgründe, um diese Informationen zu veröffentlichen und nicht abzurufen.Alles, was jdow und tlng05 sagen, ist auch wahr, aber Protokolle sind die wichtigsten "oops there it is" mit HTTP (S) GET.
Ihr Administrator in einem Forum: "Hey, ich habe dieses Problem mit dem Administratorfenster meiner Site. Sie können es hier sehen: http://example.com/category.php?catID=admin&pageNumber=hunter2
"* Felder werden für Administratoren selbst unbekannt sein *" - Ich bin mir nicht sicher, was Sie damit meinen.Werden sie dynamisch generiert?Oder schlagen Sie `? Myusername = mypassword` vor?Warum konnten Sie mit POST nicht dasselbe tun?
"POST" gegen "GET" ist kein großer Stolperstein für Hacker, aber es hilft.Jedes bisschen ... hilft
Ihr größeres Problem ist, dass Sie HTTPS oder HTTP verwenden.Wenn Sie nur HTTP verwenden;POST oder GET stehen MITM gleichermaßen offen.Wenn Sie den Kanal sichern (was Sie sein sollten), ist [GET etwas weniger sicher.] (Http://stackoverflow.com/questions/4143196/is-get-data-also-encrypted-in-https)
_Aber da Feldnamen bekannt sind, kann ein Hacker versuchen, die Passwörter zu knacken, selbst wenn einige Sicherheitsmethoden implementiert sind_ - Gleiches gilt für eine herkömmliche GET-Anforderung.Aber kein Grund, warum Sie keine dynamisch generierten Feldnamen verwenden können.Speichern einer Suche, von der welche auf dem Server ist.Hilft nicht massiv der Sicherheit, erschwert aber den Hackern das Leben.
GET-Anfragen werden auch im Webbrowser in HISTORY gespeichert - das ist ein einfaches Ziel für fast jeden, der es schafft, auch nur 15 bis 20 Sekunden lang auf Ihren Computer zu gelangen.
Wenn Sie Benutzername und Kennwort in eine GET-Anfrage einfügen, werden diese möglicherweise in der Adressleiste Ihres Browsers angezeigt, abhängig von der URL-Länge. Dies kann ein Problem sein, wenn jemand nahe genug ist, um Ihren Bildschirm zu sehen.
Warum nicht die Autorisierungsmethode verwenden, die wir bereits in URLs haben?https: // user: pass@example.com / `.Auf diese Weise können Sie eine Verknüpfung zu etwas herstellen, für das eine Authentifizierung erforderlich ist. Der eigentliche Authentifizierungsprozess erfolgt jedoch über Anforderungsheader und wird normalerweise nicht in einem Protokoll angezeigt.
`Feldnamen sind bekannt`: Es spielt keine Rolle, es sei denn, Sie verwenden schwache Passwörter."Administratoren benötigen keine benutzerfreundliche Anmeldung": Legen Sie dann einfach die Authentifizierung über Ihren Webserver (z. B. Apache) fest.Sie können entweder die Basisauthentifizierung verwenden und Kennwörter im Browser speichern (mithilfe des Hauptschlüssels) oder Clientzertifikate in Browsern installieren (keine Kennwörter erforderlich).In jedem Fall ist es viel sicherer als die Verwendung von GET.
Wenn Sie sich für Spezifikationen interessieren, empfiehlt die http-Spezifikation dringend, dass GET-Variablen nur zum Abrufen verwendet werden sollten, um den Status Ihrer Anwendung nicht zu ändern.Abgesehen von den Sicherheitsaspekten, die dahinter stehen, kann es ein Faktor sein, wenn Ihr Code für eine ISO-Zertifizierung oder ähnliches zertifiziert werden muss, die die Einhaltung von Standards erfordert.
GET ist sehr anfällig für [Fälschung von Cross-Site-Anfragen] (https://en.wikipedia.org/wiki/Cross-site_request_forgery), z.über Bilder.Obwohl mir nicht klar ist, wie jemand dies nutzen könnte, ist es am besten, jede Aktion zu vermeiden, die über ein GET zu einem Ergebnis auf dem Server führt (in diesem Fall beim Anmelden).Nicht zu wissen, wie etwas ein Angriffsvektor sein könnte, bedeutet nicht, dass es keiner ist.Vermeiden Sie problematische Ansätze, die gegen den RFC verstoßen.
Neun antworten:
jdow
2017-01-04 09:29:50 UTC
view on stackexchange narkive permalink

Dadurch wird der Anmeldelink mit Kennwort und Benutzername im Browserverlauf gespeichert. Es könnte auch versehentlich von Dingen wie Firewall-Protokollen erfasst werden, die keine Post-Variablen erfassen würden.

Außerdem werden überall URLs mit Parametern weitergegeben (stellen Sie sich Ihre Abfrage mit Benutzernamen- und Kennwortparametern vor, die beim Stapelaustausch angezeigt werden).Dies könnte Sie auch für CSRF-Angriffe öffnen.
Und selbst wenn Sie HTTPS verwenden, gibt es immer noch viele Browsererweiterungen, die die vollständige URL der Seite erfassen, die Sie besuchen.[WOT] (https://lifehacker.com/web-of-trust-sells-your-browsing-history-uninstall-it-1788667989) ist ein aktuelles Beispiel, das viel Werbung gemacht hat, aber es gibt und gab andere.
Ich erinnere mich an eine Site, die eine ordnungsgemäße Authentifizierung durchgeführt hat, dann aber einen Sitzungsschlüssel generiert hat, den sie in die URL eingebettet hat (GET-Stil).War eher anfällig für diese URL-Freigabe, da mehr Leute "? User = me & password = letmein" bemerken, aber "? Sess = 012345678" weniger offensichtlich ein Problem ist.
Wenn Sie Google Chrome verwenden, wird Ihr Browserverlauf standardmäßig auch an Google gesendet.
tlng05
2017-01-04 09:51:04 UTC
view on stackexchange narkive permalink

Ich kann mir einige Gründe vorstellen, warum dies nicht ideal wäre:

  • In dem von Ihnen veröffentlichten Codefragment codieren Sie jetzt einen geheimen Schlüssel fest in den Quellcode Ihres Programms. Dies ist schlecht, denn wenn Sie jetzt Ihren Quellcode veröffentlichen oder mit anderen teilen möchten, müssen Sie daran denken, diesen Schlüssel zu redigieren. Die Sicherheit eines Systems sollte nicht davon abhängen, dass sein Quellcode verborgen bleibt.
  • Dies lässt sich nicht gut skalieren. Wenn Sie nur einen geheimen Schlüssel haben, den alle Administratoren gemeinsam nutzen müssen, ist es viel einfacher, versehentlich zu verlieren. Wenn es leckt, können Sie nicht wissen, wer für das Auslaufen verantwortlich ist. Sie können jedem Administrator einen anderen Schlüssel zur Verfügung stellen, dies wird jedoch sehr schnell unübersichtlich.
  • Sie können den Schlüssel nicht einfach ändern. Im Allgemeinen benötigen Sie wahrscheinlich Site-Administratoren, die nicht auch Server-Betreiber sind. Mit diesem Setup können Sie jedoch niemandem die Möglichkeit geben, den Schlüssel zu ändern, ohne auch Zugriff auf den Quellcode und den Server zu gewähren, die er möglicherweise nicht verwenden kann. Das willkürliche Ändern des Quellcodes, der auf einem Produktionssystem ausgeführt wird, ist fehleranfällig und führt wahrscheinlich zu Ausfallzeiten.
  • Da Sie GET verwenden, kann der Schlüssel sehr leicht oder versehentlich durch Browserverläufe lecken Link-Sharing.
  • Es ist nicht sehr benutzerfreundlich. Um dies zu verwenden, müssen Sie wissen, wie Sie einen bestimmten GET-Parameter manuell bearbeiten. Sie sagen, dass Benutzerfreundlichkeit für Administratoren nicht erforderlich ist, aber dies trifft im Allgemeinen definitiv nicht zu. Ihre gesamte Site sollte so benutzerfreundlich wie möglich sein, einschließlich des Administratorbereichs.

Zusammenfassend kann ich sehen, dass diese Art von System als vorübergehende Maßnahme auf einer winzigen Site verwendet wird Es gibt einen Site-Administrator, der auch den Quellcode der Site geschrieben und den Server verwaltet hat. Wenn Sie jedoch größer sind, möchten Sie ein tatsächliches Administrator-Anmeldefenster mit gehashten und gesalzenen Anmeldeinformationen haben, die wie jeder andere Benutzer in der Datenbank gespeichert sind.

Zu Punkt 2: Es ist nicht wirklich chaotisch, jedem Administrator unterschiedliche Schlüssel zu geben.Das geheime Teilen ist eigentlich ziemlich einfach.
@Mego Ich meinte hauptsächlich chaotisch in Bezug auf Code.Was passiert beispielsweise, wenn Sie verschiedene Berechtigungsstufen zuweisen oder Administratoren hinzufügen / entfernen möchten?Dies führt auch zum dritten Punkt.
AbraCadaver
2017-01-04 20:42:06 UTC
view on stackexchange narkive permalink

Nicht ausschließlich aus Sicherheitsgründen, aber Hypertext Transfer Protocol - HTTP / 1.1 RFC 2616 macht deutlich:

... die Konvention war festgestellt, dass die Methoden GET und HEAD NICHT die Bedeutung haben sollten, eine andere Aktion als das Abrufen auszuführen. Diese Methoden sollten als "sicher" angesehen werden. Auf diese Weise können Benutzeragenten andere Methoden wie POST, PUT und DELETE auf besondere Weise darstellen, sodass der Benutzer darauf aufmerksam gemacht wird, dass eine möglicherweise unsichere Aktion angefordert wird.

GET sollte nur zum Abrufen verwendet werden. In Ihrem Fall, in dem Sie Daten an den Server senden, führt der Server diese spezifischen Aktionen aus (mindestens):

  • Authentifizieren eines Benutzers
  • Erstellen einer zu verfolgenden Sitzung Benutzerstatus (PHP erstellt Sitzungsdaten in Flatfiles oder einer Datenbank)
  • Das Setzen eines Sitzungscookies zum Verfolgen der Sitzung

POST über HTTPS ist die bevorzugte Übertragungsmethode sensible Daten; Benutzername, Passwort in diesem Fall.

GET-Operationen sollten idempotent sein, was bedeutet, dass Sie die Operation immer und immer wieder sicher ausführen können.Mit anderen Worten, Sie * ändern * nichts auf dem Server ... Sie liefern einfach die Daten, die zum Anfordern einer bestimmten Ressource (in diesem Fall einer authentifizierten Seite) erforderlich sind.Für alles andere als eine statische HTML-Site führt eine GET-Anforderung fast immer wichtige Aktionen aus (z. B. muss www.mystore.com/product.php?productid=123 die Produktseite noch erstellen und anzeigen).Die Verwendung von GET für vertrauliche Daten ist in der Tat eine SEHR schlechte Idee, aber nicht unbedingt wegen RFC 2616.
@DVK: Es ist ein sehr guter Grund, obwohl es andere gibt, die in anderen Antworten umrissen sind.Beim Anmelden und Starten einer Sitzung (in PHP) gibt es mehrere Änderungen auf dem Server, und Ihre Sitzung bleibt über mehrere Seiten hinweg bestehen.
@DVK GET-Operationen sollten nicht nur idempotent sein, sie sollten rein sein (was ich denke, was Sie gemeint haben).Idempotent zu sein bedeutet, es zweimal zu tun, hat die gleichen Nebenwirkungen wie einmal.Rein zu sein bedeutet, es einmal zu tun, hat die gleichen Nebenwirkungen wie es überhaupt nicht zu tun.Zum Vergleich: DELETE ist idempotent, aber nicht rein.
@James_pic "Rein zu sein bedeutet, es einmal zu tun, hat die gleichen Nebenwirkungen wie es überhaupt nicht zu tun."Wenn es um Bedeutung geht, geht es um Ressourcen, nicht um den Aufruf serverseitiger Prozesse, die zum Abrufen der Ressource erforderlich sind.Das Anmelden hat wirklich keine Nebenwirkungen in Bezug auf Ressourcen.Es wird keine Ressource erstellt, gelöscht oder geändert.Es enthält die Daten (in diesem Fall Authentifizierungsinformationen), die zum Auffinden und Anzeigen der Ressource erforderlich sind, nicht anders als bei? Productid = 123.Der Hauptunterschied besteht darin, dass der RFC DOES angibt, dass vertrauliche Informationen NICHT in GET enthalten sein dürfen.
@AbraCadaver Nahezu jede dynamische Site wird Änderungen auf dem Server für jede Anforderung aufrufen, unabhängig davon, ob Sie sich authentifizieren oder nicht.Die Wichtigkeit ist, dass Sie mit den zugrunde liegenden Ressourcen selbst nichts anfangen.Alle serverseitigen Änderungen betreffen lediglich die Anzeige der Ressource.Ein Benutzer, der sich anmeldet oder nicht anmeldet (oder sich neunmal anmeldet), hat im Allgemeinen keine Auswirkungen auf die Ressourcen, auf die er zugreifen möchte. Daher würde ich argumentieren, dass die Anmeldung rein (sicher) ist.Wenn das Erstellen einer Sitzung die Verwendung von GET ausschließt, kann GET grundsätzlich nur für statische Ressourcen verwendet werden.
@DVK: Abschließend scheinen ** NICHT ** und ** außer Abrufen ** ziemlich einfach zu sein.Beim Anmelden ändert die Aktion den Status von nicht authentifiziert in authentifiziert und erhält möglicherweise Zugriff auf zusätzliche Daten und / oder Aktionen.
Die Regel ist nicht, dass GET nichts mit den Ressourcen tun sollte.Die Regel ist, dass GET nicht als Aufforderung des Clients verstanden werden sollte, etwas zu tun - alles, was passiert, geschieht, weil der Server entschieden hat, dass er es tun möchte, und der Client sollte nicht dafür verantwortlich sein.
Andy Holland
2017-01-04 17:40:34 UTC
view on stackexchange narkive permalink

Wie gut können Sie Administratorkennwörter im Klartext in Ihren Webserver-Zugriffsprotokollen speichern?

Das Problem, das ich hier sehe, ist, dass eine GET-Anforderung alle Daten enthalten muss Feldnamen und Werte im Anforderungs-URI. Anforderungs-URIs werden von allen Arten von Prozessen protokolliert und wahrscheinlich vollständig im Webserver-Zugriffsprotokoll gespeichert.

Das bedeutet, dass Ihr Webserver-Zugriffsprotokoll das Sicherheitsrisiko erhöht, da es jetzt die Benutzernamen und Kennwörter für GET-basierte Anmeldeseiten enthält. Während Sie Serverprotokolle im Allgemeinen als privilegierte Informationen behandeln (z. B. die IP-Adressen Ihres Kunden), sind sie in der Regel nicht so vertraulich, dass sie genügend Informationen enthalten, um die Verwaltungsschnittstelle eines Clients zu gefährden.

POST ist hierfür überlegen. weil die Feldnamen und Werte nicht im Protokoll gespeichert sind.

Machavity
2017-01-05 00:04:25 UTC
view on stackexchange narkive permalink

Ein böswilliger Benutzer erhält Administratoranmeldeinformationen. Verwenden eines Bild-Tags

  <img src = "https://example.com/login?username=admin&amp;password=topsecret" style = "display: none" >  

Sie täuschen Ihren Browser vor, sich anzumelden (Bilder unterliegen standardmäßig keinen domänenübergreifenden Einschränkungen). Sie können dann eine Reihe von "Bild" -Aufrufen verwenden, um Daten abzurufen oder zu ändern (viele AJAX-Aufrufe verwenden GET auch falsch). Es gibt Möglichkeiten, dies zu vermeiden, aber die meisten Leute aktivieren sie nicht. Wenn Sie POST verwenden, funktioniert dieser Angriffsvektor nicht.

Feldschlüssel ist unbekannt, wie kann ein Angreifer das erraten?
Wie bereits an anderer Stelle erwähnt, können Sie dies über einen Browser abrufen oder von einem Benutzer freigeben.Sicherheit durch Dunkelheit hält nur so lange an, wie es Ihren Benutzern wichtig ist.
@AmirrezaNasiri Wenn es ein öffentlich sichtbares Anmeldeformular mit GET gibt, wie kann der Name des Passwortfelds unbekannt sein?
Ich denke, @AmirrezaNasiri schlägt vor, dass es keine sichtbare Form geben würde - stattdessen würden Administratoren nur wissen, wie man get-Parameter in die Adressleiste eingibt.
Lucas
2017-01-04 18:11:21 UTC
view on stackexchange narkive permalink

Das Problem bei der Verwendung der get-Methode besteht darin, dass die Daten standardmäßig auf dem Bildschirm und in den Webserver-Protokollen angezeigt werden.

Meine Faustregel lautet, Post für Kennwörter und wichtige Informationen wie Blog-Artikel zu verwenden Redakteure und Gebrauch bekommen für fast alles andere. Natürlich gibt es einige Ausnahmen, bei denen die Daten zu sensibel sind, um selbst in den Protokollen angezeigt zu werden. Aber diese sind selbst im Unternehmensbereich selten.

Zum Beispiel habe ich eine Assistentenfunktion mit 5 Schritten, bei der ich im ersten Schritt eine Prozess-ID generiere und bei jedem Schritt ? proc_id = 123 . PHP unterstützt die Abfragezeichenfolge auch in Post-Methoden. Selbst in einem Schritt, in dem die Formulardaten zu groß sind und ich gezwungen bin, die Post-Methode zu verwenden, wird die Prozess-ID in der URL wie ? Proc_id = 123 angezeigt.

Dies Erleichtert das Lesezeichen von Dingen, erleichtert das Verstehen der Zugriffsprotokolle und lehrt Dritte, die sich in meine Apps integrieren möchten.

In diesem Szenario müssen einige Vorsichtsmaßnahmen getroffen werden, um Probleme mit der Zurück-Schaltfläche zu vermeiden B. das Löschen von Verlaufs-URLs, die nicht erneut gesendet werden dürfen. Die meisten Speicheraktionen sind so.

Natürlich schützt Sie der POST nicht vor einem MiTM-Angriff. Es wird nur verhindert, dass vertrauliche Informationen wie Kennwörter in die Protokolle Ihrer Site und in den lokalen Verlauf des Browsers geschrieben werden.

Andre Geddert
2017-01-04 22:04:00 UTC
view on stackexchange narkive permalink

Beachten Sie auch, dass GET-Requests nichts auf der Serverseite ändern sollen. Eine Statusänderung wie "abgemeldet" -> "angemeldet" muss immer mit einer POST-Anfrage durchgeführt werden.

Mit einem GET-Parameter wie

  https: / /example.com/loginpage.php?password=topsecret  

ist semantisch genau dasselbe wie

  https://example.com/loginpage/password / topsecret  

Es gibt also überhaupt keine Authentifizierung. Es ist nur eine "geheime" URL, die Sie kennen müssen, um sich "anzumelden".

Um es klarer zu machen. Wenn Sie beispielsweise Apache verwenden, können Sie das gleiche Ergebnis mit einer Umleitung wie der folgenden erzielen:

 RedirectTemp-Kennwort / topsecret veryobfuscateddirectoryname / logged 

und platzieren Sie dann auf der angemeldeten Seite Ihren session_start ()

Leo Wilson
2017-01-07 21:55:20 UTC
view on stackexchange narkive permalink

Selbst wenn der Benutzer und das Kennwort nicht im Verlauf des Browsers gespeichert wurden (was sie als URL-Parameter sind), ist es für jeden Hacker extrem einfach, Ihre Informationen zu stehlen. Es wird in den Protokollen des Servers angezeigt und macht es noch einfacher , einen Man-in-the-Middle-Angriff durchzuführen. Es erlaubt auch viele schlechte Praktiken, wie Leute, die die Login-URL mit einem Lesezeichen versehen, sie vergessen und andere Menschen ihren Webbrowser benutzen lassen.

TL; DR: Dies ist eine schreckliche Idee.

bdsl
2017-01-07 05:44:37 UTC
view on stackexchange narkive permalink

Ja, das ist eine schlechte Praxis. Jeder Sicherheitsvorteil, der durch einen geheimen Feldnamen verfügbar ist, kann auch dadurch erzielt werden, dass dieses Geheimnis dem Kennwort vorangestellt wird.

Anstelle von GET mit

  elephant = rthg4e5sdc  

Sie sollten POST besser mit

  password = elephantrthg4e5sdc  

verwenden. Und natürlich können Sie die Sicherheit erneut erhöhen, indem Sie Ändern Sie dies in etwas mehr wie

  password = ehu3dva7rthg4e5sdc  


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...