4 Stimmen

PHP Best Practice für die Benutzerauthentifizierung auf einer Website?

Ich baute mehrere Websites mit sehr einfachen Code von PHP und so weit so gut, aber ich passiert, dass ich jetzt über das Thema "Sicherheit" besorgt bin ich frage mich, was ist der beste Weg, um ein Login / Authentifizierung in PHP erstellen

Das ist es, was ich derzeit tue:

bei der Registrierung gibt der Benutzer eine E-Mail und ein Passwort ein Das Passwort wird in mysql als md5-String gespeichert, so dass es niemand außer dem Benutzer kennt.

Wenn der Benutzer sich anmeldet, mache ich

SELECT * FROM usertable WHERE email = $emailsubmitted AND pass = md5($passsubmitted)

Wenn die Größe des resultierenden Arrays größer als Null ist, bedeutet dies, dass der Benutzer existiert.

also habe ich

session_start(); 
$_SESSION['logged'] = 'true';
$_SESSION[userid] = userid;

Für jede Seite, die der Benutzer aufruft, wird geprüft, ob die Sitzungsvariable existiert.

FAZIT: Ich frage mich, ob dies sicher genug ist und wie es verbessert werden kann.

3voto

jmkeyes Punkte 3741

Ihre SQL-Anweisung weist eine Injektionsschwachstelle auf. (Dabei wird davon ausgegangen, dass das Suffix "submitted" bedeutet, dass die Variable noch nicht gefiltert wurde). Wenn ein böswilliger Benutzer die Anweisung 'admin@example.com' AND 1=1;-- als E-Mail-Adresse angeben, könnten sie sich mit den Anmeldedaten von "admin@example.com" anmelden, unabhängig vom Passwort. Ich würde vorschlagen, die SQL-Eingabe zu sichern und/oder gespeicherte Verfahren zu verwenden. Ich würde auch vorschlagen, nur die Spalten zu laden, die Sie unbedingt benötigen; das verbessert die Geschwindigkeit der Abfrage und ermöglicht es, dass weniger Status außerhalb der Datenbank in der Schwebe gehalten wird.

Zusätzlich sollten Sie das Passwort mit einem Salting versehen. Wenn jemand die Daten des Benutzers aus der Datenbank abrufen würde, wären die Passwörter ein leichtes Ziel für Bruteforce- und Wörterbuchangriffe (wie Rainbow-Tables). Wenn Sie wirklich paranoid sind, sollten Sie von MD5 zu SHA oder einer anderen Hash-Funktion wechseln.

Vergewissern Sie sich, welche Variablen in Ihrer Datenbank gesetzt sind. php.ini und dass sie auf die von Ihnen erwarteten Werte eingestellt sind. Abhängig von diesen Einstellungen kann die Array-Zuweisung an $_SESSION ist ebenfalls unsicher. Einige alte Webanwendungen nutzten eine PHP-"Funktion", durch die Variablen im Abfrage-String zu globalen Variablen in der Webanwendung wurden, was bedeutete, dass bei der Ausführung $_SESSION['userid'] = $userid; wenn ein böswilliger Benutzer die ?userid=1 in den Abfrage-String einfügen, wird er zum Benutzer mit der Benutzer-ID 1, der oft der erste Benutzer (oder Administrator) ist.

1voto

simshaun Punkte 20979

Die allgemeine Logik ist in Ordnung, ja. Allerdings ist ein einfaches md5 des Passworts nicht gut.

  • Wird das Kennwort nicht gesalzen, ist der Hash offen für Abfragen in der Regenbogentabelle.

  • md5 wird im Allgemeinen nicht als guter Hashing-Mechanismus für Kennwörter angesehen. Ich empfehle Ihnen, einen Blick zu werfen auf http://www.openwall.com/phpass/

Nebenbemerkung: Ihr SQL erscheint für SQL-Injektionen anfällig sind.

1voto

Flipper Punkte 2591

Zusätzlich zu den bereits erwähnten SQL-Injections würde ich empfehlen, dass Sie nicht prüfen, ob das Array größer als Null ist, sondern ob das Array gleich Eins ist.

Angenommen, jemand ändert Ihre Datenbank und führt eine einfache Abfrage durch, um alle Kennwörter zu löschen oder sie auf einen bestimmten Eintrag zu setzen, dann würde die Prüfung auf "gleich eins" dies verhindern.

Angenommen, mehrere Benutzer haben dasselbe Kennwort und sie geben den Benutzernamen per SQL ein oder Sie vergessen, den Benutzernamen zu überprüfen, dann sind Sie auch in diesem Fall sicher, wenn die Überprüfung gleich eins ist.

Letztlich ist es eine Kleinigkeit, aber wenn es um Sicherheit geht, zählt jedes bisschen.

0voto

Francesco Panina Punkte 318

Das erste, was ich bemerke, ist, dass Sie den MD5-Hash auf eine php-Variable anwenden. Das lässt mich denken, dass das Kennwort auf dem Kanal klar reist.

Sie sollten den MD5-Hash client-seitig mit js anwenden, hier ein Beispiel:

http://phpjs.org/functions/md5/

Wenn Sie eine weitere Sicherheitsebene hinzufügen möchten, sollten Sie neben dem Standard-Hash auch ein Salt verwenden. Dies schützt Sie vor diktatorischen Angriffen oder Reverse-Hashing (siehe dies: http://tools.benramsey.com/md5/ )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X