2010-11-20 6 views
0

Was ist der beste Weg, um eine sichere Benutzerauthentifizierungsfunktion zu erstellen? Unten ist der Kern einer php-Funktion, die den Benutzernamen und das Passwort eingibt und gegen die Datenbank prüft.Sicherste PHP-Benutzer-Authentifizierungsfunktion

Ich bin speziell an der Abfrage und deren Rückgabewert interessiert. Ist der 'else if ($ query1)' der beste Weg um die Session Variable zu validieren und zu setzen? Welcher Wert wird am besten für die Sitzungsvariable festgelegt? Eine E-Mail-Adresse, Benutzername, Bool-Variable, Primärschlüssel-Index, etc?

$query1 = mysql_fetch_array(mysql_query("SELECT primaryKey 
              FROM loginInfo 
              WHERE email = md5('$email') 
              AND password = md5(CONCAT('$password',salt)) 
              LIMIT 1")); 
if (!$query1) 
    return false; 
else if ($query1) { 
    $_SESSION['userNumber'] = $query1[primaryKey]; 
    return true; 
} 
else 
    return false; 

Antwort

1

MD5 hat bekannte Sicherheitslücken und wird nicht mehr als sicher angesehen. Sie sollten zu einem stärkeren Hash wie SHA-2 wechseln.

Auch $query1 kann nur zu wahr oder falsch, so dass die endgültige else Teil ist nutzlos und wird nie erreicht werden. Ihre drei Zweige entsprechen diese gerade:

if (!$query1) 
    return false; 
else { // else $query1 is obviously true 
    $_SESSION['userNumber'] = $query1[primaryKey]; 
    return true; 
} 

Es gibt nicht so etwas wie ein „best value“ in der Sitzung zu speichern, aber der Primärschlüssel ist in der Regel eine ideale Wahl, da es garantiert eindeutig sein und bietet auch eine einfache Möglichkeit, die restlichen Details nachzuschlagen. Wenn Sie außerdem häufig Informationen wie den Namen des Benutzers sehen, können Sie dies zusätzlich in der Sitzung für den einfachen Zugriff speichern.

1

Es gibt mehrere Probleme mit diesem Code:

  • SQL-Injection-Schwachstelle. (Was passiert, wenn ein Benutzer eine E-Mail-Adresse von ') OR 1=1 OR '' = (' eingibt?) Sie sollten sich mysql_real_escape_string ansehen oder die Verwendung von parametrisierten Abfragen in Erwägung ziehen.
  • Sie rufen nie auf der Ressource, die von mysql_query zurückgegeben wird, die Ressourcen auf dem MySQL-Server (bis das Skript beendet wird), und möglicherweise zukünftige Abfragen in demselben Skript ausführen ausgeführt.
  • MD5 ist wegen Sicherheitslücken veraltet. Erwägen Sie stattdessen, einen Hash in der SHA-Familie zu verwenden.
+0

Ist sha1 die einzige Hash-Funktion aus der SHA-Familie in PHP? – Tableking

+0

Nein. Siehe ['hash()'] (http://php.net/manual/en/function.hash.php) und ['hash_algos()'] (http://us.php.net/ manual/de/function.hash-algos.php) funktioniert. Wenn Ihre DB nicht die selbe Hash-Funktion unterstützt, die Sie wählen, müssen Sie möglicherweise Werte in das PHP-Skript holen und dann eine andere Abfrage ausführen ... also wählen Sie sorgfältig aus. SHA1 ist meiner Meinung nach vorerst sicher. – cdhowie

0

Es hängt davon ab, wo der Angreifer Zugriff haben wird. Wenn er irgendwie Zugriff auf die Datenbank hat, sind die vorgeschlagenen Änderungen des Hash-Typs wichtig.

Wenn nicht, ist es wichtiger, die Anzahl fehlgeschlagener Logins zu begrenzen, um Bruteforce-Angriffe zu vermeiden.

Allerdings muss die Schwachstelle, auf die cdhowie hingewiesen hat, überhaupt behoben werden.

+0

Ich sollte beachten, dass ich den Code der Einfachheit halber reduziert. Ich übergebe die Variablen $ email und $ password an die Funktion, die bereits nach Injektionsschwachstellen gescrudelt wurde. Ich benutze tatsächlich SHA1. Obwohl ich mysql_free_result nicht anrufe. –

Verwandte Themen