2009-06-08 14 views
36

Ich richte gerade ein Authentifizierungssystem ein. Mein aktuelles Layout ist, seine E-Mail von der $_POST, md5 sein Passwort zu bekommen, und überprüfen Sie die Datenbank gegen seine E-Mail und sein Passwort. Wenn sie paßt, ich benutze session_start, und ich fange an Daten in den $_SESSION Variablen gespeichert, etwa so:Richtiger Weg, Sitzungen in PHP zu verwalten?

$_SESSION['uid'] = $uid; 
$_SESSION['first_name'] = $first_name; 

Und auf jeder Seite der Website, würde ich eine einfache Überprüfung von

isset($_SESSION['uid']); 
Vorform

Wenn nicht, umleiten auf die Indexseite, wenn ja, laden Sie die Seite.

Mache ich das richtig? Ist das sicher genug? Wie leicht ist es für jemanden, diese Daten zu fälschen?

Jemand sagte mir, dass ich eine Tabelle mit der E-Mail-Adresse des Benutzers und seiner Sitzungs-ID erstellen und diese verwenden sollte, um die Dinge zu verwalten ... Ich bin ziemlich verwirrt geworden - wie würde das helfen?

Könnte jemand das klären? Wie kann man die Authentifizierung mit PHP-Sitzungen richtig verwalten?

Danke.

+1

Sie bereits wissen, wie richtig Sitzungen zu verwenden. Was Sie jedoch erstellen möchten, ist ein * Authentifizierungssystem *. Das ist viel komplexer. Sie können sich https://github.com/delight-im/PHP-Auth ansehen und die Quelle nachsehen, um etwas zu sehen, wo viel Aufwand und Nachdenken steckt. – caw

Antwort

41

Sicherheits-Update suchen: ab 2017.10.23: Die Beratung in dieser Antwort, während von historischen Bedeutung, ist völlig unsicher. Man sollte niemals md5 benutzen, um ein Passwort zu hashen, weil es so leicht brutal erzwungen wird. Unter this answer erfahren Sie, wie Sie das integrierte Passwort password_ * api verwenden, um Kennwörter zu überprüfen und zu überprüfen.


ich mit Login/Authentifizierungssysteme früher beschäftigt haben, und ich finde einige Mängel in diesem Verfahren:

  • Sie „md5 sein Passwort, und überprüfen Sie die Datenbank“ - das bedeutet, dass, wenn Eine Person hat Zugriff auf die Datenbank, er kann herausfinden, wer die gleichen Passwörter hat!

Addendum (19. September 2015) * Schauen Sie sich das link. Es erklärt alle Grundlagen, die Ansätze, die Sie ergreifen könnten, warum Sie diese Ansätze verwenden sollten und gibt Ihnen auch Beispiel-PHP-Code. Wenn es zu lange ist, um zu lesen, gehen Sie einfach zum Ende, greifen Sie den Code und setzen Sie sich!

besseren Ansatz: md5 von username+password+email+salt in der Datenbank zu speichern, Salz zufällig ist und zusammen mit dem Datensatz des Benutzers gespeichert.

  • Verwenden Sie die 'UID' direkt in den Sitzungsvariablen kann sehr riskant sein. Bedenken Sie Folgendes: Mein Freund ist von meinem Browser aus angemeldet und er geht auf ein Leck. Ich überprüfe schnell, welche Cookies in seinem Browser eingestellt sind und entziffere seine 'uid'. Jetzt besitze ich ihn!

besserer Ansatz: eine zufällige sessionid zu erzeugen, wenn sich der Benutzer erfolgreich, und speichern diese Sitzungs-ID in der $_SESSION[] Array. Sie müssen auch die Sitzungs-ID mit seiner Benutzer-ID verknüpfen (mithilfe der Datenbank oder memcached). Die Vorteile sind:

  1. Sie sogar einen sessionid an eine bestimmte IP binden kann, so dass die sessionid nicht einmal missbraucht werden kann, wenn es erfasst wird
  2. Sie können eine ältere sessionid ungültig, wenn der Benutzer von einem anderen Ort protokolliert . Wenn sich mein Freund von seinem eigenen Computer aus anmeldet, wird die Sitzungs-ID auf meinem Computer automatisch ungültig.

EDIT: Ich habe Cookies immer manuell für meine Sitzung verwendet, die Sachen behandelt. Dies hilft mir, die JavaScript-Komponenten meiner Web-Apps leichter zu integrieren. Möglicherweise benötigen Sie in Zukunft in Ihren Apps dasselbe.

+0

Wie kann ich eine zufällige Session ID generieren? mit start_session? – daniel

+1

mit geschickter Anwendung der Zufallsfunktion. Ich habe es ausprobiert, und es gibt ziemlich gute Ergebnisse .. überprüfen Sie es hier: http://jrharshath.qupis.com/random/ – jrharshath

+1

Das war gut in 2009, jetzt verwenden Sie bcrypt oder so etwas. –

-3

Ich bin nicht 100% darauf, aber ich denke, dass es möglich ist, die Sitzung zu schmieden, wenn jemand wirklich wollte!

Ich denke, das Speichern der Session-ID in einer Tabelle ist der sicherste Weg, dies zu tun.

Ich habe in letzter Zeit ein wenig darüber nachgedacht, aber ich bin mir nicht sicher, interessiert, was Best Practice ist!

Hier sind ein paar Ressourcen

http://www.sitepoint.com/article/php-security-blunders/

http://www.phpeasystep.com/workshopview.php?id=6

26

Es ist nichts falsch mit diesen

isset($_SESSION['uid']); 

Die Sitzungsdaten zu tun ist, nicht an den Benutzer übertragen, wird es auf dem Server gespeichert (oder wo auch immer die Session-Handler speichert sie). Was an den Benutzer übertragen wird, ist die Sitzungs-ID, bei der es sich um eine zufällige Zeichenfolge handelt, die von PHP generiert wird. Diese kann natürlich gestohlen werden, weil sie an den Benutzer gesendet wird.

Es sollte deutlich darauf hingewiesen werden, dass das zufällige Speichern einer Zeichenfolge in der Datenbank und der Benutzersitzung und das anschließende Identifizieren des Benutzers die Sitzung nicht sicherer macht, wenn der Angreifer die Sitzung erhält, die er noch haben wird kompromittiert den Benutzer.

Was wir jetzt diskutieren ist session hijacking, denken Sie vielleicht, dass Sie nur die IP-Adresse in der Sitzung speichern und überprüfen Sie, ob mit der IP aus der Anfrage kommen und damit fertig sein. Aber es ist oft nicht so einfach, ich habe mich vor kurzem verbrannt, als wir in einer großen Web-Anwendung einen Hash des User Agent + IP-Adresse in der Sitzung gespeichert und dann überprüft haben, dass sie bei 99% der Benutzer übereinstimmten das hat gut funktioniert. Wir haben jedoch Anrufe von Leuten bekommen, die feststellten, dass sie ständig ohne Erklärung ausgeloggt wurden. Wir haben die Session-Hijacking-Prüfungen protokolliert, um zu sehen, was vor sich ging, und festgestellt, dass diese Leute auf einer IP eingehen und ihre Sitzung auf einer anderen fortsetzen würde. Dies war kein Entführungsversuch, sondern wie ihr Proxy-Server gearbeitet, als Ergebnis haben wir unsere Session Hijacking-Code geändert, um die class of the IP address zu ermitteln und von dort herauszufinden, den Netzwerkteil der IP-Adresse und nur diese Teile der IP-Adresse zu speichern, ist dies etwas weniger sicher in dieser Session Hijacking könnte theoretisch herkommen innerhalb des gleichen Netzwerkes, aber alle unsere falschen Positiven gingen weg.

Verwandte Themen