Was ist der richtige und sichere Weg, um einen Benutzer angemeldet zu halten? Kekse? Sitzung? PHP && MYSQL

Lesezeit: 8 Minuten

Später habe ich gefragt, wie man einen Benutzer korrekt abmeldet, jetzt sehe ich, dass es überhaupt nicht sicher ist, nur Cookies zu verwenden, um einen Benutzer angemeldet zu halten.

Das Speichern des Passworts in einem Cookie ist keine sichere Methode, daher lautet meine Frage: Wie kann ich mich auf meiner Website richtig anmelden (anmelden / den Benutzer angemeldet lassen)?

Derzeit speichere ich die Benutzer-ID, die dieselbe ist, die die URL zum Anzeigen des X-Benutzerprofils benötigt, sowie die E-Mail und das Passwort, die in MD5 verschlüsselt sind.

Setcookie ist die einzige Funktion, die ich bei einer erfolgreichen Anmeldung verwende. Ich verwende Sitzungen nur zum Speichern von Zufallszahlen, um wiederholte Formularübermittlungen zu vermeiden. versteckte Felder.

• Können Sie mir zeigen, wie es richtig und sicher geht?

• Wie machen Sie das?

Nur PHP. Zwei Monate in PHP, alles aus Ihren Antworten gelernt. Vielen Dank

  • Ich verstehe nicht. Warum würden Sie das Passwort in einem Cookie speichern? Verwenden Sie Sitzungen, keine Cookies. Speichern Sie einfach einen booleschen Wert in einer Sitzungsvariablen, um zu überprüfen, ob ein Benutzer angemeldet ist oder nicht.

    – Fluch

    12. Mai 2012 um 20:05 Uhr

  • @Flukey: Die Session-ID wird normalerweise über ein Cookie übertragen. Es kann genauso wie ein Passwort-Cookie gestohlen werden, und der Angreifer würde sich als Sie anmelden, ohne Ihr Passwort überhaupt eingeben zu müssen.

    – Madaras Geist

    12. Mai 2012 um 20:32 Uhr

  • mögliches Duplikat von The Definitive Guide To Forms Based Website Authentication

    – eigelb

    12. Mai 2012 um 22:00 Uhr

  • @Wahrheit – ja. Ich weiß das. Ich habe ihm nicht gesagt, dass er das Passwort in der Sitzung speichern soll

    – Fluch

    12. Mai 2012 um 22:12 Uhr


  • Sie sollten nach Möglichkeit ein vorhandenes Authentifizierungsframework wiederverwenden. Schauen Sie sich zum Beispiel an github.com/delight-im/PHP-Auth

    – kräh

    21. September 2016 um 2:26 Uhr

Benutzer-Avatar
Madaras Geist

Lassen Sie mich Ihnen zunächst Folgendes sagen. Nichts ist 100% sicher. Nichts ist luftdicht und nichts ist heilig. Wenn er motiviert genug ist, wird ein Angreifer jede serverseitige Verteidigung durchbrechen, die Sie möglicherweise einsetzen (es sei denn, Sie verwenden HTTPS, was eine andere Geschichte ist).

Sie können Cookies verwenden, aber Cookies sind stark exponiert und leicht zu ändern. Speichern Sie niemals private Daten oder Zugriffsebenen in einem Cookie. Da es von einem Angreifer leicht gestohlen/modifiziert werden kann.

Sitzungen sind auch nicht 100% sicher. Die Sitzungs-ID, die der Server verwendet, um den Client zu identifizieren, wird auf einem von zwei Wegen gesendet. eine $_GET-Variable (schlecht) oder ein Cookie (besser, aber immer noch ziemlich schlecht). Das heißt, wenn Sie als Administrator über ein ungesichertes WLAN angemeldet sind, kann ein geschickter Angreifer (und mit geschickt meine ich einen pr0 haxx0r, der einen einfachen HTTP-Sniffer heruntergeladen hat) Ihre SESSION-ID leicht stehlen. Und obwohl Sie Ihr Passwort nicht erhalten, wird der Server den Angreifer fälschlicherweise als Sie identifizieren und ihm jeden Zugriff gewähren, den Sie haben/hatten.

Was also tun? Sitzungen sind in den meisten Fällen sicher. Weisen Sie Ihre Benutzer darauf hin, sich nicht in einem ungesicherten Netzwerk (Busse, Internetcafés usw.) anzumelden. Wenn Sie Ihre Benutzerberechtigung über einen längeren Zeitraum bestehen lassen möchten, ist ein Cookie erforderlich. Normalerweise verwende ich ein 2-Cookie-System, wenn ich das brauche:

userid=12345
hash=password_hash($userid . $hashed_password, PASSWORD_DEFAULT)

Dann habe ich etwas, mit dem ich übereinstimmen kann, und die Details des Benutzers wurden nicht preisgegeben.


Aber wie ich schon sagte, am Ende des Tages, wenn Sie Ihre Benutzer wirklich WIRKLICH sichern wollten, besorgen Sie sich HTTPS.

  • sehr schöne Antwort, können Sie bitte so etwas wie oben auch für https sagen. das würde ich gerne lesen. Sie haben mir gerade eine Menge Dinge in einer einzigen Antwort beigebracht. Wenn ich nur ein paar Informationen über https bekommen kann, wäre ich sehr dankbar. ein Link vielleicht. ?

    – Rishiraj Purohit

    10. November 2015 um 15:32 Uhr

  • Ich recherchiere zum selben Thema wie oben beschrieben. Was ich sehr relevant finde, ist, dass die Sitzungs-ID in einem nicht sicheren Browser-Cookie gespeichert wird. Die Sitzungs-ID kann mit session_name() geändert werden (nützlich, um Hacker abzuschrecken) und dieses Cookie kann nur mit session_set_cookie_params() zu einem sicheren Cookie über HTTPS gemacht werden.

    – Jay Jee

    24. Januar 2019 um 15:17 Uhr

Ich würde eine Sitzung verwenden.

Um ein wenig zur Sicherheit beizutragen, verwenden Sie, sobald die Anmeldeinformationen eines Benutzers überprüft wurden session_regenerate_id – Da die Sitzungs-ID in einem Cookie weitergegeben wird, ist dies wichtig, wenn jemand herumschnüffelt, während die Anmeldung verarbeitet wird.

SPEICHERN SIE KEINE Informationen in der Sitzung, die sich auf Zugangsdaten beziehen – eine Benutzer-ID ist oft ausreichend; Persönlich baue ich ein Benutzerobjekt, das ich in der Sitzung speichere (diese werden zwischen den Anfragen automatisch serialisiert / unserialisiert – aber Sie können das unabhängig voneinander lesen).

WENN Sie ein Cookie setzen möchten, damit sich der Benutzer beim nächsten Besuch nicht anmelden muss, speichern Sie möglicherweise die Benutzer-ID und ein automatisch generiertes Token, das in der Datenbank (oder ähnlichem) überprüft werden kann – ich würde der Überprüfung auch Extras hinzufügen – Speichern Sie beispielsweise die letzte IP-Adresse mit dem Token, um sie ebenfalls zu überprüfen. Wenn sie nicht übereinstimmen, fragen Sie erneut nach der Anmeldung.

Es gibt eine Reihe von Ansätzen, die verfolgt werden können – ich biete nicht alles/’das Beste’ – lassen Sie Ihren Code von Leuten in einer PHP-Community überprüfen – auf diese Weise lernen Sie mehr.

Wenn eine Person über ein Login und ein Passwort verfügt, kann dies als Cookie in ihrem Browser gesetzt werden, damit sie sich nicht bei jedem Besuch Ihrer Website erneut anmelden muss. Sie können fast alles in einem Browser-Cookie speichern. Das Problem ist, dass ein Benutzer Cookies jederzeit blockieren oder löschen kann. Wenn beispielsweise der Warenkorb Ihrer Website Cookies verwendet und eine Person ihren Browser so eingestellt hat, dass sie diese blockiert, kann sie nicht auf Ihrer Website einkaufen.

Wenn Sie Daten in Cookies speichern, müssen Sie absolut sicher sein, dass Benutzer die Daten in keiner Weise manipulieren können. Es gibt keine Möglichkeit, Benutzer daran zu hindern, die Daten in einem Cookie zu ändern. es ist absurd einfach. Um also sicherzustellen, dass Ihre Website keine Cookies mit geänderten Daten akzeptiert, müssen Sie die Cookie-Werte entweder verschlüsseln oder mit einem Hash signieren, mit dem Sie ihre Integrität überprüfen können.

  • Selbst wenn ein Cookie verschlüsselt ist, kann niemand das Cookie stehlen und sich damit anmelden. Wenn sie Zugriff auf den Computer haben, ist dies so, als ob Sie Ihr Passwort auf dem Computer hinterlassen würden

    – Thomas Williams

    21. September 2016 um 23:26 Uhr

Best Practice ist die Verwendung von PHP-Sessions.

Eine PHP-Sitzung wird aufrechterhalten, indem der Browser eine kryptografisch sichere (d. h. nicht erratbarer) String zurückgibt, der als bekannt ist Session-ID jedes Mal, wenn es während dieser Sitzung eine Anfrage stellt. Der beste und sicherste Weg, dies zu tun, besteht darin, dem Browser eine Session-Cookiedie es dann bei jeder Anfrage mitsendet.

Die alternative Methode zur Verwendung von a Session-Cookie soll die PHP-Session-ID in der Anfrage-URL selbst als GET-Variable enthalten sein. Eine Beispiel-URL könnte etwa so aussehen:

https://www.example.com/mypage.php?PHPSESSID=cteekbf64igp5vdjjkktvoeb97

Dies ist nicht so sicher wie die Verwendung eines Cookies, da die URL versehentlich weitergegeben oder auf andere Weise gestohlen werden könnte.

Sicherheit ist vielschichtig, wie eine Zwiebel (wie das allgemeine Beispiel sagt). Je sicherer Sie etwas machen, desto mehr Aufwand ist erforderlich, um es sicher zu machen, und desto weniger bequem ist es zu verwenden. Es ist ein Kosten-Nutzen-Abwägen. Sie müssen sich also fragen, wie wichtig Ihre Daten sind, ist die Privatsphäre und Sicherheit Ihrer Benutzer usw.

Für mich wäre eine Basisebene die Verwendung von PHP-Sitzungen mit der Sitzungs-ID, die zwangsweise in Cookies enthalten sein muss (Blockieren von Benutzern, die Cookies deaktivieren), die ständige SSL-Verschlüsselung, sowohl für Daten als auch für die Cookies, und sicherstellen, dass die verschiedenen PHP-Einstellungen dies tun Auswirkungen auf die Sicherheit für Sitzungen haben die besten und sichersten Einstellungen. Sie werden alles auf diesen Seiten und untergeordneten Seiten lesen wollen:

Wie @Madara sagte, ist nichts 100% sicher und korrekt, aber aus Entwicklersicht würde ich sagen, dass jede einzelne Methode zum Aufbewahren von Benutzersitzungsdaten ihre eigenen Vor- und Nachteile hat.

Benutzerdaten in Cookies vs. Sitzung

Wenn Sie die Sitzungsdaten des Benutzers in Cookies aufbewahren, verbraucht dies weniger RAM-Speicher und Verarbeitung des Servers, da Sie die Informationen des protokollierten Benutzers nicht im RAM speichern müssen. Auch wenn der Benutzer zunimmt, wird empfohlen, Benutzersitzungsdaten in Cookies und nicht in Sitzungen zu speichern, da das Beibehalten der Sitzung Serverressourcen verbrauchen würde und Ihre Anwendung langsamer sein und manchmal nicht mehr reagieren könnte. wo, als ob Sie die eingeloggten Daten des Benutzers in der Sitzung behalten. Es wäre sicherer als Cookies, aber es würde mehr Serverressourcen verbrauchen.

Zum Schluss:
Beide Möglichkeiten sind in ihrer eigenen Implementierung korrekt, auch wenn Ihre Anwendung das HTTPS-Protokoll verwendet, sollte die Sicherheit kein Problem sein. Daher würde ich vorschlagen, Methoden zur Aufbewahrung der Sitzungsdaten des Benutzers gemäß den Anforderungen der Anwendung und des Geschäftsmodells zu verwenden.

1089760cookie-checkWas ist der richtige und sichere Weg, um einen Benutzer angemeldet zu halten? Kekse? Sitzung? PHP && MYSQL

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy