Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PHP-Anmeldeformular mit HTML-Formular

Nur wegen des Kopfzeugs (damit Sie eine Vorstellung davon haben, warum Fred -ii- gesagt hat, diesen Code nicht zu verwenden) - ich werde das der Reihe nach etwas auseinander nehmen, während ich es durchgehe (ist es nicht ein persönlicher Seitenhieb auf die Person, die die Frage stellt - aber nur um eine Vorstellung davon zu geben, dass der Versuch, eine halbwegs sichere Anwendung auf dem LAMP-Stack zu bauen, ein wenig Sorgfalt und Voraussicht erfordert ... und blutigen Zynismus, gepaart mit der Annahme des Schlimmsten Menschlichkeit hilft):

Punkt 1

Kein Problem - aber wirklich, wenn Sie eine Sitzung starten wollen, sollten Sie eine Sitzung unabhängig davon starten, ob $_POST vorhanden ist Daten oder nicht. Sie sollten wahrscheinlich Ihre Konfigurationsdatei anfordern und die Sitzung vor allem anderen ganz oben starten.

Kein Terminalfehler (da Sie keine Sitzungsvalidierung haben) - nur seltsam.

Punkt 2

Sie haben die Ausgabe in dieser Datei (echo ) daher muss es sich im Dokumentenstamm befinden und im Webbaum verfügbar sein.

include("config.php");

Dies ist nicht wirklich richtig geschrieben, es sollte wahrscheinlich require_once 'config.php'; sein (vorausgesetzt, es handelt sich um eine erforderliche Programmdatei und nicht um ein optionales Include, das fehlschlagen kann), aber das ist nicht der Fehler. Der Fehler ist, dass Sie Ihre Konfigurationsdatei in Ihrem Dokumentenstamm haben. Eine Server-Fehlkonfiguration oder ein einfacher Tippfehler in dieser Datei könnte theoretisch dazu führen, dass der Inhalt dieser Datei im Klartext auf dem Bildschirm ausgegeben wird, wodurch möglicherweise Ihre Datenbank-Verbindungszeichenfolgen (und wer weiß was noch) an world + dog preisgegeben werden.

Konfigurationsdateien sollten außerhalb des Webbaums oder, falls dies nicht möglich ist, in einem Verzeichnis vorhanden sein, das mit so etwas wie .htaccess geschützt ist Deny from all . Sie sollten niemals über HTTP zugänglich sein.

Punkt 3

Die mysql Die Bibliothek ist veraltet und sollte überhaupt nicht verwendet werden. MySQLi oder PDO sind der richtige Weg, idealerweise mit gebundenen Parametern/Werten:

http://uk3.php.net/PDO

http://uk3.php.net/mysqli

Persönlich würde ich für PDO.

Punkte 4 und 5

$password = mysql_real_escape_string(stripslashes(md5($_POST['password'])));

Zunächst einmal ist die Reihenfolge falsch. Sie hashen $_POST['password'] und dann versuchen, Stripslashes zu entfernen - es werden keine Schrägstriche mehr vorhanden sein, sobald es gehasht wurde. Wenn Sie jedoch versuchen, Leute daran zu hindern, Schrägstriche (oder was auch immer) in Passwörtern zu verwenden, müssen Sie sie entfernen, bevor Sie die Zeichenfolge hashen.

Als nächstes md5 sollte nicht als Passwort-Hashing-Algorithmus verwendet werden, hat sich als schwach herausgestellt und kann durch Brute-Force viel häufiger zu String-Kollisionen führen, als es sollte.

Ja, Sie sollten Speichern Sie nur Hashes oder "Fingerabdrücke" der Passwörter und nicht die Passwörter selbst, aber idealerweise möchten Sie salzen und hashen (mindestens mit sha1 ) diese Passwörter, anstatt sie einfach in ein md5() zu werfen Funktion.

Siehe:http://uk3.php.net/mcrypt zum Beispiel

Und suchen Sie mit der Suchmaschine Ihrer Wahl nach „Password Salting Hashing“.

Punkt 6

SELECT id FROM $table 
WHERE username = '" . $username . "' 
and password = '" . $password . "';

Ich habe den = hinzugefügt das fehlte in der ursprünglichen Frage, aber stimmen Nutzername und Passwort in Ihrer Anfrage nicht überein ... wenn es jemandem gelingen würde, eine SQL-Injektion in Ihren Benutzernamen zu bekommen, würde das Passwort niemals überprüft werden. Stellen Sie sich vor:

SELECT user.id 
FROM user WHERE user.username = 'fred' OR 1 = 1 
-- AND user.password = 'abc123'

Es ist besser, die Benutzer-ID und den Passwort-Fingerabdruck aus der Datenbank auszuwählen und das Passwort dann in der Anwendung auszuwerten, anstatt einer Passwortprüfung in der Datenbankschicht zu vertrauen. Das bedeutet auch, dass Sie einen dedizierten Hashing- und Salting-Algorithmus in der Anwendung selbst verwenden können, um Ihre Passwörter zu validieren.

Punkt 7

$_SESSION['user'] = $_POST["username"];

Dies speichert lediglich den Benutzernamen in der Sitzung? Dies sollte auf keinen Fall als "Login-Verifizierer" verwendet werden, zumal es (anscheinend) nichts in Ihrer Sitzung gibt, um Hijacking .

Die Sitzungs-ID könnte leicht aus dem Cookie einer Live-Sitzung herausgeschnüffelt werden, und das wäre alles, was erforderlich wäre, um sich das Login einer anderen Person "auszuleihen". Sie sollten zumindest versuchen, die Wahrscheinlichkeit einer Entführung der Sitzung zu mindern, indem Sie die IP-Adresse des Benutzers, die UserAgent-Zeichenfolge oder eine andere Kombination aus relativ statischen Daten verknüpfen, die Sie auf jeder Seite vergleichen können ... praktisch jeder Ansatz hat jedoch Nachteile (insbesondere, wie ich festgestellt habe, wenn Sie Besucher haben, die AOL verwenden) - aber Sie können einen wahrscheinlich zu 99+% effektiven Sitzungs-Fingerabdruck erstellen, um das Entführen mit sehr geringer Wahrscheinlichkeit zu verhindern, dass die Sitzung des Benutzers fälschlicherweise abgelegt wird.

Idealerweise möchten Sie auch ein Token für die Sitzung erstellen, um CSRF Angriffe, wenn der Benutzer eine "privilegierte" Aktion in der Datenbank ausführen muss (seine Details aktualisieren oder was auch immer). Das Token könnte ein völlig zufälliger und eindeutiger Code sein, der in der Datenbank und/oder in einem SSL-Cookie gespeichert wird, wenn sich der Benutzer anmeldet (vorausgesetzt, der Benutzer kann keine Aktion ausführen, die die Datenbank außerhalb von HTTPS aktualisiert, da dies nur die Daten übertragen würde im Klartext über das Internet - was eine schlechte Idee wäre ).

Das Token wird in ein verborgenes Formularfeld für beliebige/alle Formulare eingefügt und mit dem im Cookie (oder der Sitzung oder Datenbank) gespeicherten Wert verglichen, wenn dieses Formular gesendet wird. Dadurch wird sichergestellt, dass die Person, die das Formular absendet, zumindest eine Live-Sitzung auf Ihrer Website hat.