wie ein sicheres PHP-Login-System erstellen, so dass für die Funktionalität „Halten Sie mich angemeldet“?

StackOverflow https://stackoverflow.com/questions/1929340

Frage

verwende ich ein einfaches Login-System basiert auf SESSION Vars. Sobald der Benutzer anmeldet, ist eine Sitzung var-Set, das mein Skript ist der Benutzer sagt, in Kauf genommen werden. Ich habe keine benutzerdefinierten client Cookie var verwenden.

Ich möchte die Möglichkeit, auf dem Anmeldebildschirm bieten, der sagt „halten Sie mich in den ganzen Tag loggued“. Wie kann man tun, dass in einer sicheren Art und Weise?

War es hilfreich?

Lösung

Erstens: Konfigurieren Sie den session.cookie_lifetime Richtlinie entweder in der php.ini, Konfigurationsdateien oder über session_set_cookie_params() .

Als nächstes speichern Sie die Benutzername und den Hash-Wert des Passworts in der Sitzung, und bestätigt, dass Login auf jeder Seite. Solange es noch gültig ist, erhalten sie angemeldet bleiben.

Die natürliche Ablauf der Session-Cookie sollte in der Regel die Dinge ordentlich halten, da Sie nicht jemand immer in der Mitte ihrer Sitzung abgemeldet (wenn die Sterne für sie ausgerichtet sind, natürlich), wenn sie es aktiv zu halten. in Ermangelung eines solchen, aber ich würde eCartoth Lösung an zweiter Stelle prüfen, wie Sie gerade eine zweite Linie auf die if-Anweisung könnte hinzufügen:

if (my_validate_user_function($_SESSION['username'],$_SESSION['passhash']) 
    && $_SESSION['deathstamp'] > time()
) {
    // user is logged in again, oh boy!
}
else {
    // send in the death robots
    header('Location: /login.php',true,302);
}

EDIT: Eine Sache, die Sie betrachten wünschen könnte, ist Session-Fixation und / oder Session-Hijacking. Um das zu verhindern, würde ich eine (oder beide) von zwei Lösungen empfehlen:

  1. speichern die IP-Adresse des Benutzers in der Sitzung
  2. verwenden session_regenerate_id() nach jedem erfolgreichen Login-Versuch.

Andere Tipps

Wenn Sie sagen, „halten Sie mich in dem ganzen Tag angemeldet“, ich nehme an, Sie auf, dass bestimmte Maschine nur bedeuten, richtig? Sie könnten eine MySQL-Tabelle zu erinnern, ‚Zeit der Login‘ oder einen Zeitstempel verwenden, wenn die Anmeldung nicht mehr gültig sein, wenn sie beschließen, sich den ganzen Tag angemeldet zu halten. Dann fügen Sie ein Skript an den Anfang des Codes, der die ID des Benutzers abruft aus der Sitzung Vars. Vergleichen Sie den aktuellen Zeitstempel des Benutzers mit den gespeicherten ‚letzten gültigen ts‘ und wenn es Vergangenheit, die Zeit, die Sie kennen sollten sie bei dem abgemeldet, werden Punkt, den Sie die Sitzung wischen und den Benutzer zwingen, sich erneut anzumelden. Dieses Verfahren bedeutet, dass sie nicht wirklich abgemeldet werden, bis sie versuchen und tun etwas über diesen Punkt, aber es wird wie es ihnen scheinen. Auch, anstatt eine MySQL-DB können Sie auch speichern, die letzte gültige TS in einer Sitzungsvariablen als auch.

So zum Beispiel, wenn der Benutzer zum ersten Mal mit „halten Sie mich in den ganzen Tag angemeldet ausgewählt“:

$_SESSION['log_me_out_at'] = strtotime(date("Y-m-d ")."23:59:59");

Dann wird jedes Mal, wenn eine Seite in Ihrem System zugegriffen wird:

if( $_SESSION['log_me_out_at'] < time() ){
  unset($_SESSION['user_is_accepted_in']);
}

Eine Option könnte sein, eine MySQL-Tabelle einrichten, die Session-Variablen und ordnet sie mit IP-Adressen speichert und einen Ablauf, aber ich bin nicht sicher, ob alle Details darüber, wie das umgesetzt werden würde.

Die einfachste (aber nicht empfohlen) Art und Weise zu tun, was Sie suchen einen $_COOKIE mit dem Benutzernamen und Passwort auf dem Computer zu setzen wäre, die Ihre Website wird dann prüfen, wenn die Benutzer anmeldet.

Für zusätzliche Sicherheit Sie besser gedient wäre nur ein Cookie als gesalzen MD5-Hash des Benutzerdaten zu speichern, um eine potentielle Hacker zu bieten weniger Informationen über die Kontodaten des Benutzers. Die Dauer kann so eingestellt werden, wenn Sie das Cookie gesetzt; php.net hat einigermaßen vollständige Dokumentation darüber, wie das zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top