Login mit php,mysql

08154711

Erfahrenes Mitglied
Hallo,
Hat jemand von euch eine Idee, ich will ein Login mit Benutzername und Passwort über eine Datenbank realisieren. Alle Sachen die ich bis jetzt probiert habe, klappten nicht. Die Datenbank erstelle ich mit phpadmin(XAMPP). Ich suche ein, für mich nachvollziehbares Tutorial oder Anleitung dazu.
Danke
 
Google ist dein Freund...
Eine Suche nach login tutorial php liefert sage und schreibe 17.100.000 Ergebnisse. Schon der erste Treffer sieht brauchbar aus (kann ich aber nicht sagen weil ich es nicht gelesen habe). Solltest du konkrete Probleme mit dem Tutorial oder mit anderen haben, kann ich, und auch sicher viele andere hier, gerne weiterhelfen.
 
Hallo,
Auf http://www.tutorials.de/forum/php-tutorials/9684-php-mysql-login-system-mit-sessions.html
habe ich mit phpmyadmin eine Datenbank und eine Tabelle erstellt, erscheint folgende Fehlermeldung
PHP:
 CREATE TABLE `loginsystem`.`benutzerdaten` (
`Id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`Nickname` VARCHAR( 50 ) NOT NULL ,
`Kennwort ` VARCHAR( 50 ) NOT NULL ,
`Nachname ` VARCHAR( 50 ) NOT NULL ,
`Vorname ` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `Vorname ` )
) ENGINE = MYISAM

MySQL meldet: Dokumentation
#1166 - Incorrect column name 'Kennwort '

Ich deute es mal falsche Beschreibung des Kennwortes- hat jemand eine Idee:confused:
Gruß
 
SQL:
CREATE TABLE `loginsystem`.`benutzerdaten` (
`Id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`Nickname` VARCHAR( 50 ) NOT NULL ,
`Kennwort` VARCHAR( 50 ) NOT NULL ,
`Nachname` VARCHAR( 50 ) NOT NULL ,
`Vorname` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `Id` )
) ENGINE = MYISAM
Dort sind einige Leerzeichen zuviel.

Aufgrund des beträchtlichen Alters des Tutorial, würde ich dir eher das folgende Tutorial nahelegen:
Eigenes Loginsystem
 
Zuletzt bearbeitet:
Ein Tip wenn du schon mit phpmyadmin Tabellen erstellt dann tust du dir am anfang leichter wenn du das vorgesehen Menü dafür verwendest.

Dort gibst du unter deiner Db ein neue Tabelle erstellen mit natürlich dem Tabellen namen und wieviel felder du brauchst. In dem Obigen waren es glaub 5

Feld ein gibst du dann den Spaltenamen ein :Id stellt den typ auf int und autoincremet dann markierst noch das symbol mit dem schlüsse steht für Primary key
und das machste dann für alle felder Vorname,Nachname unsw nur das du dort nur mehr den Typ angibst und sonst nix verstellst.

Danach auf Ok bestähtigen und deine Tabelle wird erstellt.

Später kanst es mit den obigen geposten Sql befehlen versuchen aber für den Anfang ist das Menü wirklich leichter darüber tabellen zu erstellen.
Übrings wenn du über Menü Tabellen erstellt sieht du nach der besätigen mit ok den dazugehörigen Sql befehl.


Hab dazu noch ein Anleitung für dich Gefunden siehe link
http://www.bomots.de/phpmyadmin/phpMyAdmin kompakt Leseprobe Kap2.pdf

Ist nee pdf datei zu öffnen mit acrobat reader dort steht alles genau beschrieben drin

Mfg Splasch
 
Zuletzt bearbeitet:
Hallo,
Danke für die schnelle Antwort, bin gerade dabei das von Felix empfohlene Tut zu testen, mal sehen wie weit ich komme :)
 
Hallo 08154711

Zum Thema Login mit php/mysql hier mal eine kleine schematische Erklärung:
Das du zur DB connecten und daten auslesen kannst setze ich voraus.
Sessions sollten dir ebenfalls nicht fremd sein.

Zuerst bastelst du dir ein login-Formular, bestehend aus nem text-feld,nem password-feld und nem submit button. Als method sollte hier post gesetzt sein. action setzt du das aktuelle Skript, sodass die Seite auf sich selbst verlinkt.

Die Idee ist nun folgende: Immer, wenn die Seite aufgerufen wird, wird überprüft ob
  • Logindaten übermittelt wurden
  • bereits eine session besteht (also der User eingeloggt ist)

Um in erfahrung zu bringen, ob jemand Logindaten übermittelt hat, fragst du lediglich die betreffenden variablen ab, zb:
Code:
$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;
Der übergebene Wert für password wird hier per sha1 verschlüsselt. Das ist sicherer als md5, erfüllt aber den gleichen Zweck: Es ist unsinnig Passwörter im Klartext in der DB zu hinterlegen. Stattdessen werden sie verschlüsselt abgelegt und auch nur mit den verschlüsselten Werten verglichen.

Wenn also Passwort und Login gesetzt sind - und nur dann - startest du einen login:
Code:
if (isset($login) && isset($password)){
  $dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");
  if ($dbLoginData){
    $userData = mysql_fetch_array($dbLoginData);
    if ($userData["password"]==$password){
      header("Location: http://".$_SERVER["HTTP_HOST"]);
      exit;
    }
  }
}
Diese Zeilen setzen voraus, dass du bereits zu einer DB verbunden bist, es dort eine Tabelle user gibt, die mindestens die Spalten id,password und login enthält.
Die Anfrage mysql_query... liefert eine MySQL-Ressource zurück, die alle gematchten Ergebnisse enthält. Schlug der Aufruf fehl, so ist $dbLoginData false.
Um die MySQL-Ressource lesbar zu machen wird Sie mittels mysql_fetch_array in ein assoziatives Array umgewandelt, dessen Assoziationen den Spalten namen der Tabelle entsprechen (id,password und login).
Da ein login immer eineindeutig sein sollte, erhälst du insgesamt nur ein eindimensionales Array. Sollten weitere Matches vorhanden sein, so könntest du sie ebenfalls per mysql_fetch_array auslesen.
Und dann wird das übermittelte und verschlüsselte Passwort mit dem verglichen, dass der Datenbankaufruf zurückgeliefert hat.
Code:
if ($userData["password"]==$password){
Wenn beide Zeichenketten übereinstimmen, waren die Logindaten korrekt.

Hier passiert jetzt etwas magisches: Das Skript leitet sich sofort auf sich selbst um, bzw. auf den host, auf dem es ausgeführt wird. Das hat zwei Gründe
  • da hier Daten mit der Methode post übergeben wurden, gibt es unschöne effekte beim Aktualisieren der Seite. Hier schafft der Redirect Abhilfe.
  • Den Rest des Login-Systems sollen Sessions übernehmen


Der befehl exit; verhindert, dass nach dem Redirect versehentlich noch Befehle ausgeführt werden.
Damit nach einem Redirect der Server eine Session erkennen kann, muss natürlich eine entsprechende Session-Variable gesetzt werden. In desem Fall wird das die Variable $_SESSION["userId"] sein, die den Wert bekommt, den die DB-Abfrage als id des angemeldeten Users ergeben hat.
Um solch eine Variable setzen zu können, muss vor dem Login-Prozess eine Session gestartet bzw. wieder aufgenommen worden sein. das erledigt session_start();

Eingefügt sieht dass dann so aus:
Code:
session_start();

$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;

if (isset($login) && isset($password)){
  $dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");
  if ($dbLoginData){
    $userData = mysql_fetch_array($dbLoginData);
    if ($userData["password"]==$password){
      header("Location: http://".$_SERVER["HTTP_HOST"]);
      $_SESSION["userId"] = $userData["id"];
      exit;
    }
  }
}

Damit haben wir sicher gestellt, dass die Infos, welcher User sich angemeldet hat, in einer Session gespeichert sind. Nach dem Redirect, wird der Test, ob sich jemand anmelden zu versucht, fehlschlagen, da keine Formulardaten übermittelt wurden.

Jetzt ist es also an der Zeit, festzustellen, ob breits jemand angemeldet ist. session_start(); nimmt hierbei automatisch die vorher gestartete Session wieder auf. Alles was wir zun müssen, ist also festzustellen, ob die Sessionvariable $_SESSION["userId"] gesetzt ist.
Code:
$userIsLoggedIn = isset($_SESSION["userId"]) ? true : false;
$userId = $_SESSION["userId"];

if ($userIsLoggedIn){
  echo "Es ist der Benutzer mit der ID $userId angemeldet.";
}
else{
  echo "Es ist kein Benutzer angemeldet.";
}

Wenn die Session-Variable gesetzt ist, wird die ID des angemeldete Users ausgegeben.
Falls nicht, eine entsprechende negative Nachicht.


Alles zusammen sieht dann so aus:
Code:
session_start();

$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;

if (isset($login) && isset($password)){
  $dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");
  if ($dbLoginData){
    $userData = mysql_fetch_array($dbLoginData);
    if ($userData["password"]==$password){
      header("Location: http://".$_SERVER["HTTP_HOST"]);
      $_SESSION["userId"] = $userData["id"];
      exit;
    }
  }
}

$userIsLoggedIn = isset($_SESSION["userId"]) ? true : false;
$userId = $_SESSION["userId"];

if ($userIsLoggedIn){
  echo "Es ist der Benutzer mit der ID $userId angemeldet.";
}
else{
  echo "Es ist kein Benutzer angemeldet.";
}

Zwischen etaigen Fehlermeldungen beim Login und einem simplen "nichteingeloggtsein" wird hier nicht unterschieden. Dazu könnete man eine weitere Sessionvariable $_SESSION["error"] setzen, die festhält, ob passwort oder benutzername falsch waren etc.

Um die Session bei einem logout zu beenden dient dann der Befehl session_destroy();. Die aktuelle Session wird zerstört, ein Redirect wird gestartet und die Ausführung weiterer Befehle mit exit; verhindert.

Code:
session_destroy();
header("Location: http://".$_SERVER["HTTP_HOST"]);
exit;

Ich hoffe, ich konnte dir helfen.

session_destroy(); ;-)
huckepick
 
Ein paar kleine Anmerkungen zu obigen Skript:

  • Es ist sicherheitstechnisch bedenklich die Usereingaben nicht zu validieren. Was wenn dir einer eine SQL Injektion oder ähnliches unterschieben möchte?
  • Warum verwendest du $_REQUEST wenn du genau weißt, dass deine Daten aus einem Formular kommen?
  • Warum lässt du PHP die Arbeit machen des Passwortvergleichs, wenn du das ganze an SQL weitergeben könnte?

Ansonsten einige Kritikpunkte:
Es ist nicht gut, den Benutzer wissen zu lassen, ob nun der Benutzername oder das Passwort falsch waren. So könnte ein Benutzer der nichts Gutes im Sinne hat, etwaige Benutzeraccounts herausfinden.
 
Nehmen wir folgende Zeilen:

PHP:
$login = isset($_REQUEST['login']) ? $_REQUEST['login'] : null;
$password = isset($_REQUEST['password']) ? sha1($_REQUEST['password']) : null;
$dbLoginData = mysql_query("SELECT id,password FROM user WHERE login='$login'");

Was passiert wenn der Nutzer beim Loginnamen folgendes eingibt:

Klaus';'DROP DATABASE

Dann werden zwei SQL-Statements ausgeführt. Das ursprünglich geplante und dann ein weiteres, welches die Datenbank löscht, wenn der Datenbanknutzer ausreichende Rechte dafür hat.

Weitere Probleme ergeben sich durch das im Klartext gespeicherte und übermittelte Paßwort.
 
Zurück