Sessions (Login mit PHP)
1. Einleitung
Möchte man den Besuchern einer Webseite einen Dienst anbieten oder bestimmte Community-Fuktionen umsetzen bietet es sich unter Umständen an, die Besuchern anhand von individuellen Benutzerdaten zu identifizieren. Wir müssen den Besuchern also eine Möglichkeit geben, sich selbstständig anmelden zu können um bestimmte Funktionen zu nutzen.
Dieser Workshop befasst sich mit der praktischen Umsetzung einer solchen - bewußt einfach gehaltenen - Benutzerverwaltung mit Hilfe von Sessions.
2.1 Die Konfiguration
Bevor es an das eigentlich Script geht hinterlegen wir die Daten für die Verbindung zur MySQL - Datenbank im Array $config. Ebenfalls gespeichert wird hier der Name der Tabelle, die wir im nächsten Schritt anlegen werden. Dadurch kann man später ohne viel Aufwand einen Wechsel der Datenbank vornehmen.
<?php
require ’sessions.php’;
$config = array();
// Beginn der Konfiguration - bitte hier anpassen
// Datenbank - Verbindungsdaten
$config[‘db_name’] = ’sessionlogin’; // Name der Datenbank
$config[‘db_user’] = ‘root’; // Datenbank - User
$config[‘db_pass’] = ”; // Datenbank - Passwort
$config[‘db_host’] = ‘localhost’; // Datenbank - Host i.d.R. localhost
$config[‘db_tabname’] = ‘userdaten’; // Datenbank Tabellenname
// Ende der Konfiguration
?>info: Die Datei “session.php” wird später angelegt und genau erklärt!
2.2 Datenbank Dump einspielen
Danach legen wir in der Datenbank eine Tabelle mit den Feldern id, name, passwort und email an. Die Spalte id wird als Primärschlüssel festgelegt und bei jedem neuen Eintrag per Autoincrement hochgezählt. Das Feld passwort wird als Char mit 32 Zeichen angelegt, da wir das Passwort als md5-Hash speichern werden, aber dazu später mehr.
Am einfachsten ist das anlegen der Tabelle mit hilfe der Datei dump.sql, die wie einfach über den Menüpunkt SQL in phpMyAdmin in der gewüschten Datenbank ausführen können.
CREATE TABLE `userdaten` (
`id` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 100 ) NOT NULL ,
`passwort` CHAR( 32 ) NOT NULL ,
`email` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;2.3 Verbindung zu Datenbank
Als nächstes wird die Verbindung zur Datenbank mittels mysql_connect() und mysql_select_db() aufgabaut, sowie mögliche Fehlermeldungen abgefangen und durch eigene ersetzt.
<?php
// Datenbankverbindung aufbauen
$db = mysql_connect($config[‘db_host’], $config[‘db_user’], $config[‘db_pass’]);
if(!$db)die(“Server nicht erreichbar.”);
if(!mysql_select_db($config[‘db_name’], $db))die(“Datenbank nicht erreichbar.”);
// Ende Datenbankverbindung aufbauen
?>2.4 Session starten und IP prüfen
Des weiteren definieren wir in der Datei index.php ein Formular, mit dem sich der Benutzer später anmelden kann. Hierfür brauchen wir ein Feld von Typ Text und eines vom Typ Password. Im letztgenannten wird die Eingabe durch Sternchen (*) ersetzt, weshalb diese nicht sichtbar ist.
<?php
// Formulare aufbauen
$form_log .= ‘<form action=”index.php” method=”post” />
<fieldset>
<legend>Benutzer anmelden</legend>
<label for=”username”>Name<br />
<input style=”width: 100px;” type=”text” id=”username” name=”username” value=”" />
</label><br />
<label for=”passwort”>Passwort<br />
<input style=”width: 100px;” type=”password” id=”passwort” name=”passwort” value=”" />
</label><br />
<input style=”width: 100px;” type=”submit” name=”anmelden” value=”anmelden” />
</fieldset>
</form>’;
// Ende Formulare aufbauen
?>2.6 Das Registrierungs-Formular
Damit wir neuen Nutzern die Möglichkeit bieten können nach vorheriger Registrierung ebenfalls in den geschützten Bereich zu kommen brauchen wir ein Formular über das sich neue Benutzer eigenständig registrieren können.
Hier legen wir in die Datei register.php an und legen darin ein geeignetes Formular ab. Der potentielle Benutzer soll einen Benutzernamen, seine E-Mail-Adresse und ein Passwort angeben. Letzteres wird zur Sicherheit doppelt eingegeben.
Auf die Möglichkeit einer Freischaltung per E-Mail haben wir hier verzichtet, allerdings lässt sich das über eine weitere Spalte Status in der Datenbanktabelle und ein entsprechendes UPDATE-Statement in einer extra Datei recht einfach nachrüsten.
Ebenfalls verzichtet wurde auf eine Funktion mit der sich ein Benutzer sein Passwort erneut zusenden lassen kann. Auch dies lässt sich mit wenig Aufwand hinzufügen.
Ab hier verwenden wir eine neue Datei namens regstrieren.php:
<?php
// Formulare aufbauen
$form_reg .= ‘
<h1>Registrierung</h1>
<form action=”index.php?area=registrieren” method=”post” />
<fieldset>
<legend>neuen Benutzer anlegen</legend>
<label for=”name”>Name<br /><input type=”text” id=”name” name=”name”
value=”‘.$_POST[‘name’].‘” /></label><br />
<label for=”email”>E-Mail<br /><input type=”text” id=”email” name=”email”
value=”‘.$_POST[‘email’].‘” /></label><br />
<label for=”passwort1″>Passwort<br /><input type=”password” id=”passwort1″ name=”passwort1″
value=”" /></label><br />
<label for=”passwort2″>Passwort wiederholen
<br /><input type=”password” id=”passwort2″ name=”passwort2″
value=”" /></label><br />
<input type=”submit” name=”registieren” value=”registieren” />
</fieldset>
</form>’;
// Ende Formulare aufbauen
if(isset($_SESSION[‘user_id’]))
{
echo ‘<h1>Registrierung</h1>’;
echo ‘<p>Sie sind bereits registriert.</p>’;
}
else
echo $form_reg;
?>2.7 Die Registrierung
Nun können wir zur eigentlichen Registrierung und damit dem Anlegen eines neuen Benutzers kommen. Nachdem der neue User das Registrierungs-Formular korrekt ausgefüllt hat legen wir einen weiteren Benutzer in der Datenbank ab.
Springen wir also wieder zurück zur index.php!
2.7.1 Prüfung der Benutzereingaben
Was allerdings, wenn der Benutzer das Formular nicht korrekt ausfüllt? Solche Fehleingaben sollten wir in Vorfeld abfangen und mit einer entsprechenden Fehlermeldung quittieren.
Zunächst prüfen wir also, ob überhaupt alle Felder ausgefüllt wurden. Ist dies nicht der Fall bekommt der Besucher erneut das Formular angezeigt sowie eine passende Fehlermeldung.
Weiterhin schauen wir, ob das eingegebene Passwort eine Mindestlänge von 4 Zeichen hat und ob die Wiederholung des Passworts im zweiten Feld mit der Eingabe im ersten Feld übereinstimmt.
Als letztes versuchen wir anhand eines Regulären Ausdrucks (Regular Expression) die eingegebene E-Mail Adresse auf syntaktische Korrektheit zu überprüfen.
Das garantiert uns zwar nicht, das die E-Mail Adresse tatsächlich existiert, schützt aber zumindest den User vor einer groben Falscheingabe, beispielsweise ein vergessenes @-Zeichen.
Interessant wäre es in diesem Zusammenhang mittels der Funktion checkdnsrr() zu prüfen, ob für die Domain der E-Mail Adresse ein A, MX oder CNAME Eintrag existiert. Da dies allerdings nur auf Linux-Systemen funktioniert wurde in diesem Beispiel darauf verzichtet.
<?php
if(isset($_POST[‘registieren’]))
{
if($_POST[‘name’] == “” or $_POST[‘email’] == “” or
$_POST[‘passwort1′] == “” or $_POST[‘passwort2′] == “” )
{ $fehlermeldung = ‘<div class=”fehlermeldung”>Bitte füllen Sie alle Felder aus.</div>’;}
elseif(strlen($_POST[‘passwort1′]) < 4)
{ $fehlermeldung = ‘<div class=”fehlermeldung”>Dass Passwort ist nicht
mindestens vier Zeichen lang.</div>’;}
elseif($_POST[‘passwort1′] != $_POST[‘passwort2′])
{ $fehlermeldung = ‘<div class=”fehlermeldung”>Die Passworteingaben sind nicht identisch.</div>’;}
elseif(!eregi(“^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,4}$”, $_POST[‘email’]))
{ $fehlermeldung = ‘<div class=”fehlermeldung”>Die eingegebene E-Mail Adresse ist nicht korrekt</div>’;}
else
{
// Wenn Formvorschriften eingehalten, prüfen ob Benutzer oder E-Mail bereits existiert
$sql = “SELECT * FROM ”.$config[‘db_tabname’].“ WHERE name = ’”.$_POST[‘name’].“‘
OR email = ’”.$_POST[‘email’].“‘ ”;
$query = mysql_query($sql) or die(“Query nicht erfolgreich.”);
$anzahl = mysql_num_rows($query);
// Wenn nicht, Benutzer anlegen
?>2.7.2 Anlegen des neuen Benutzers
Nachdem sich der Besucher registriert hat kann er sich nun über das Anmeldeformular einloggen. Hierzu gibt er seine Benutzerdaten ein und das Script sucht einen auf den Benutzernamen passenden Datensatz in der Datenbank. Ist dieser gefunden werden die zugehörigen Daten ausgegeben und das von User eingegebene Passwort mit md5() codiert und mit der codiert gespeicherten Vorgabe verglichen. Sind die beiden md5-Hashes identisch ist der Benutzer authentifiziert und die Anmeldung erfolgreich. Ansonsten wird eine entsprechende Fehlermeldung ausgegeben.
Bei erfolgreicher Anmeldung werden nun die eindeutige id des Datensatzes, der Benutzername und die E-Mail Adresse in das $_SESSION-Array gespeichert.
Anhand dessen können wir nun zu jeder Zeit prüfen, ob der Benutzer angemeldet ist oder nicht.
<?php
elseif(isset($_POST[‘anmelden’]))
{
$sql = “SELECT * FROM ”.$config[‘db_tabname’].“ WHERE
name = ’”.eingaben_pruefen($_POST[‘username’]).“‘
AND passwort = ’”.md5($_POST[‘passwort’]).“‘ ”;
$query = mysql_query($sql) or die(“Query nicht erfolgreich.”);
// Wenn nicht, Benutzer anlegen
if($row = mysql_fetch_array($query))
{
$nachricht = ‘<div class=”nachricht”>Login erfolgreich!</div>’;
$_SESSION[‘user_ip’] = $_SERVER[‘REMOTE_ADDR’];
$_SESSION[‘user_name’] = $row[‘name’];
$_SESSION[‘user_id’] = $row[‘id’];
$_SESSION[‘user_email’] = $row[‘email’];
}
else{ $fehlermeldung = ‘<div class=”fehlermeldung”>Benutzername oder
Passwort nicht korrekt.</div>’;
}
}
?>2.9 Die Abmeldung
Entschließt sich der Benutzer sich wieder abzumelden, wird die Session mit session_destroy() gelöscht. Ebenso das zugehörige $_SESSION-Array.
<?php
elseif($_GET[‘action’] == “abmelden” && isset($_SESSION[‘user_id’]))
{
if(session_destroy())
{
unset($_SESSION);
$nachricht = ‘<div class=”nachricht”>Sie haben sich abgemeldet.</div>’;
}
}
?>2.10 Die Ausgabe
Abschließend verbinden wir die erstellten Formulare mit einem HMTL Gerüst. Testweise sind in dem Beispiel noch zwei Beispielseiten eingebunden, die über include() eingebunden werden. Diese zeigen die Möglichkeit auf, innerhalb einer Webseite geschützte und öffentliche Bereiche zu vereinen.
<?php
if(isset($_SESSION[‘user_id’]))
{
$login = ‘Sie sind angemeldet als ’.$_SESSION[‘user_name’].‘.<br />
<a href=”index.php?action=abmelden”>abmelden</a>’;
}
else {$login = $form_log;}
// Ausgabe in HTML Grundgerüst
echo ‘<html>
<head>
<title>Session-Login</title>
<link rel=”stylesheet” href=”styles.css” type=”text/css”>
</head>
<body>
<div class=”navi”>
<a href=”index.php?area=testseite”>Testseite ohne Login</a>
<a href=”index.php?area=testseite2″>Testseite mit Login</a>
<a href=”index.php?area=registrieren”>registrieren</a>
</div>
<div style=”clear: both; width: 540px; margin: 0 auto;”>
<div class=”content”>
’.$nachricht.‘
’.$fehlermeldung
// Endsrechende Seite anzeigen
if($_GET[‘area’] == “testseite”) { include(‘testseite.php’); }
elseif($_GET[‘area’] == “testseite2″) { include(‘testseite2.php’); }
elseif($_GET[‘area’] == “registrieren”) { include(‘registrieren.php’); }
else{ include(‘testseite.php’); }
// Endsrechende Seite anzeigen
echo ‘</div>
<div class=”login”>’.$login.‘</div>
</div>
</body>
</html>’;
?>kalleknall
Hallo,
nette Tutorial, aber gibts das ganze auch Vollständig ?
Gruß
Kalle