Felix Riesterer: Ein Loginscript

Beitrag lesen

Lieber Malcolm Beck`s,

wenn Du PHP nutzt, dann solltest Du das Generieren einer Session-ID den Automatismen von PHP überlassen. Die machen das im Regelfall besser als eine handgeschöpfte oder mundgeblasene Lösung von Dir.

Ich speichere die Logindaten in Form von:

userid | Pass (gehasht) 1 | 4a4350df2403b94a13304ee88b861041

Für den Hash verwendest Du password_hash()? Sieht nicht so aus, solltest Du aber. Aus der Kombination von password_hash() und password_verify() solltest Du ausreichend sichere Hashes bekommen.

Beim Login versuche ich 2 Cookies zu setzen. Ein SESSION-Cookie und einen normalen.

Was bitte ist ein "normales" Cookie? Zu Deiner Domain legt der Browser ein Cookie ab, in welches Du Daten schreiben lassen kannst. Es empfiehlt sich sehr, dass Da nur und ausschließlich die Session-ID steht. Alles andere speicherst Du in der Session. Wenn der User keine Cookies zulässt, dann brauchst Du einen URL-Parameter mit der Session-ID, was noch ein Grund mehr ist, überhaupt nur diese Information an den User auszugeben. Auch für diesen Fall bietet PHP diverse Voreinstellungen an, die Du nutzen (oder selbst implementieren) kannst.

// userid mit irgendwas multipliziert
$_SESSION['USER'] = '541 4a4350df2403b94a13304ee88b861041';
$_COOKIE['USER']  = '541 4a4350df2403b94a13304ee88b861041';

Das bedeutet, dass die Passwort-Informationen im Cookie des Users auf dessen Computer abgelegt werden. Das willst Du nicht, da bin ich mir sicher, denn Du weißt, dass die Cookie-Daten unverschlüsselt durchs Netz gehen, wenn Du keine https-Verbindung hast. Und selbst wenn, könnten eventuelle XSS-Attacken die Cookie-Daten herausleiten und so eventuell die Passwortdaten "befreien".

// Wenn Session, aber kein Cookie, Loginformular - damit ist schonmal Session Hijacking unterbunden
if $_SESSION['USER'] AND !$_COOKIE['USER']
  exit()

Ein Session-Hijacking unterbindest Du sinnvollerweise dadurch, dass Du bei jedem Request eine neue Session-ID generieren lässt. Diese Herangehensweise stört sich allerdings mit der Idee, die Session-ID über einen URL-Parameter zu übertragen (denke an AJAX-Calls und die href- bzw. action-Werte im Dokument). Eventuell ist ein Cookie-Zwang für diverse Bereiche Deiner Seite Grundvoraussetzung.

// Wenn Session und Cookie vorhanden sind, Datenbankabfrage sparen, da die Sessiondaten auf dem Server liegen und vom Nutzer nicht geändert werden können
if $_SESSION['USER'] AND $_COOKIE['USER']

  // Sessiondaten mit Cookiedaten vergleichen, wenn beide richtig, ist User eingeloggt
  // Kann ich das so machen?
  $_COOKIE['USER'][0] == $_SESSION['USER'][0]
  $_COOKIE['USER'][1] == $_SESSION['USER'][1]

// Automatisches Login: Datenbank mit den Daten im Cookie abfragen, wenn keine Session vorhanden ist
if $_COOKIE['USER'] AND !$_SESSION['USER']

  // wenn beide Daten im Cookie richtig sind, ist User authentifiziert
  $_COOKIE['USER'][0] == $_USERINDB
  $_COOKIE['USER'][1] == $_USERPASSINDB

Entweder der User kommt mit einer gültigen Session-ID an, oder nicht. Sollten seine Session-Daten in Ordnung sein, ist er auch eingeloggt. Das kannst Du damit überprüfen, indem Du in den Session-Daten (aber nicht im Cookie und schon gar nicht in irgendeinem URL-Parameter!!) das Passwort des Users (gerne als Hash aus der DB) ablegst und bei einem Request gegen den Hash aus der DB abgleichst.

Ich könnte das ganze jetzt um eine weitere Prüfung erweitern, in dem ich einfach alle vom User genutzten IPs beim Login checke, ob die aktuell nur mit Cookie aufrufende IP schon einmal genutzt wurde, wenn nicht, Login erzwingen. Ohne diese Prüfung könnte ein Hacker, wenn er die Userid und das gehashte Passwort richtig errät, das Profil kapern. Was aber ja auch schon schwierig genug sein dürfte.

Warum? Du hast bei manchen Providern den Fall, dass Leute bei einem Seitenaufruf die einzelnen Dateien mit unterschiedlichen IP-Adressen aufrufen, da der Provider die Requests über einen Pool an IP-Adressen leitet. Das würde die User-Experience im Zweifelsfall empfindlich behindern!

Um Deine Sicherheit zu erhöhen, kannst Du beim Einloggen mit einer Zwei-Faktor-Authentifizierung arbeiten: Nach dem Login mit Usernamen und Passwort verschickst Du eine Mail mit einem Zufallswert, der ergänzend eingegeben werden muss, der nur etwa fünf Minuten lang gültig ist und nach der ersten Verwendung sofort ungültig wird, bevor die Session einen vollständigen Login speichert. Danach hast Du Deine Session, deren "Sicherheit" Du nur durch eine sich bei jedem Request ändernde Session-ID gegen Session-Hijacking härten kannst (bedeutet Cookie-Pflicht). Sonst gibt es da meines Wissens nichts, was Du noch tun könntest.

Liebe Grüße,

Felix Riesterer.

0 58

Ein Loginscript

Malcolm Beck`s
  • datenbank
  • php
  1. -2
    pl
    1. 0
      Orlok
      • perl
      • zu diesem forum
  2. 0
    Jörg Reinholz
    1. 0
      Jörg Reinholz
      1. 0
        Malcolm Beck`s
        1. 0
          Jörg Reinholz
          1. 0
            woodfighter
            1. 0
              Auge
              • datenbank
              • menschelei
              • php
              1. 0
                Christian Kruse
                1. 0
                  Jörg Reinholz
          2. 0
            Malcolm Beck`s
            1. 2
              Auge
              • php
              • sicherheit
              1. 0
                Malcolm Beck`s
                1. 2
                  Jörg Reinholz
                  1. 0

                    Ein Loginscript - so weit, so gut

                    Malcolm Beck`s
                    1. 0
                      Matthias Apsel
                      1. 0
                        Malcolm Beck`s
                        1. 1
                          Auge
                          • internet-anbindung
                          • sicherheit
                          1. 0
                            woodfighter
                            • internet-anbindung
                            1. 0
                              Auge
                              1. 0
                                woodfighter
                                1. 0
                                  Auge
                      2. 0
                        woodfighter
                        1. 0
                          Jörg Reinholz
                        2. 0
                          Matthias Apsel
                          1. 0
                            woodfighter
                            • internet-anbindung
                    2. 1
                      Jörg Reinholz
                      • php
                      • programmiertechnik
                      • programmiertechnik
                      1. 0

                        Ein Loginscript - so weit geklärt

                        Malcolm Beck`s
                    3. 1
                      Jörg Reinholz
                      1. 0
                        Malcolm Beck`s
            2. 1
              woodfighter
    2. 0
      Malcolm Beck`s
      1. 0
        woodfighter
      2. 1
        Jörg Reinholz
    3. 3
      1unitedpower
  3. 2
    Felix Riesterer
    1. 4
      Christian Kruse
      1. 0
        Malcolm Beck`s
        1. 1
          Christian Kruse
          1. 0
            Malcolm Beck`s
            1. 0
              Christian Kruse
              1. 0
                Malcolm Beck`s
            2. 2
              woodfighter
              1. 0
                woodfighter
                • sicherheit
            3. 1
              Tabellenkalk
              1. 0
                Auge
                • datenbank
                • menschelei
                • php
              2. 0
                Jörg Reinholz
      2. 0
        Felix Riesterer
        1. 0
          Christian Kruse
      3. -2
        pl
        1. 0
          woodfighter
    2. 0
      Malcolm Beck`s
      1. 3
        Christian Kruse
        1. 0
          Malcolm Beck`s
          1. 0
            Christian Kruse
            1. 0
              Malcolm Beck`s
              1. 0
                Christian Kruse