ein login-system, basierend auf MySQL und sessions

erfahrungsgemäß wollen PHP-anfänger immer gleich hoch hinaus. dies beginnt z.b. oft mit der typischen, sog. clan-page über eine eigene community hinweg zum größeren vorhaben (was leider oft scheitert, da man nicht immer bereit ist, sich auch mal theorie anzulesen).
das login-system, das ich vorstelle ist ein einfaches, aber sehr sicheres und effizientes, das durchaus noch weiter ausgebaut werden kann.

man beginnt mit dem einfachsten, dem formular.
erstellt ein formular nach euren wünschen oder richtet euch nach dem hier gegebenen:

login.html

Code:
<form action="check_login.php" method="POST">
username: <input type="text" name="u_name">
password: <input type="password" name="u_pass"><p>

<input type="submit" value="login">
</form>
damit ist das formular schon fertig.

als nächstes muss eine datenbankstruktur her, die in einer SQL-datei abgelegt auf einem SQL-server ausgeführt und mit benutzerdaten gefüttert wird.
hier wird auf eine MySQL-datenbank zurückgegriffen:

structure.sql

Code:
CREATE TABLE u_users
(
u_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
u_name VARCHAR(50) NOT NULL,
u_pass VARCHAR(33) NOT NULL
);
weswegen die spalte u_pass 33 stellen hat, kann weiter unten gelesen werden.

es wird noch eine konfigurationsdatei benötigt, in der die zugriffsdaten für den server gespeichert sind.

config.inc.php

PHP-Code:

<?php
//eine variable als array deklarieren, um mehrere werte in einem zusammenzufassen
$_access = array();

$_access['host'] = 'localhost'; //kann abweichen, ist aber meistens "localhost"
$_access['user'] = ''; //der benutzername
$_access['pass'] = ''; //das passwort
$_access['name'] = ''; //der name der datenbank
?>
nun muss noch eine verbindung mit der datenbank aufgebaut werden, die geschieht der besseren übersicht wegen durch eine weitere datei.

connect.inc.php

PHP-Code:

<?php
if(!$conn = mysql_connect($_access['host'], $_access['user'], $_access['pass']))
{
echo 'verbindung zu '.$_access['host'].' fehlgeschlagen';
exit();
}

if(!$db_select = mysql_select_db($_access['name']))
{
echo 'die erforderliche datenbank antwortet nicht';
exit();
}
?>
es wird also jedes mal geprüft, ob etwas NICHT ausgeführt wurde. sobald eine der beiden funktion FALSE ausgibt, wird der vorgang abgebrochen.

jetzt die eigentliche login-funktion, die eher eine überprüfung darstellt und dementsprechend reagiert.

check_login.php

PHP-Code:

<?php
session_start();

//konfiguration und verbindungsdaten holen
include_once('config.inc.php');
include_once('connect.inc.php');

//prüfen, ob die eingabefelder ausgefüllt wurden
if(empty($_POST['u_name']) || empty($_POST['u_pass']))
{
//wenn sie nicht ausgefüllt wurden
echo 'es wurden nicht alle relevanten felder ausgefüllt';
exit();
}
//wenn sie ausgefüllt wurden
else
{
//eine SQL-abfrage vorbereiten und sie abschicken
$sql = "SELECT u_id,
u_name,
u_pass
FROM u_users
WHERE u_name = '".mysql_real_escape_string($_POST['u_name'])."'
AND u_pass = '".md5($_POST['u_pass'])."'
";

$result = mysql_query($sql) or die(mysql_error());

//prüfung, ob genau eine der spalten mit der eingabe überein stimmt
if(mysql_num_rows($result) != 1)
{
//wenn nicht übereinstimmt
echo 'sie konnten nicht als benutzer identifiziert werden';
exit();
}
//wenn übereinstimmt
else
{
//eine session "logged" auf TRUE setzen
//eine session mit dem usernamen erstellen
$_SESSION['logged'] = TRUE;
$_SESSION['u_name'] = $_POST['u_name'];

//auf die geschützte datei weiterleiten
header('location: intern.php');
exit();
}
}
?>
die datei intern.php ist ganz einfach zu erstellen.

intern.php

PHP-Code:

<?php session_start();
include_once('val_login.php');
echo 'hallo' .$_SESSION['u_name'].', willkommen im internen bereich';
?>
das wars auch, aber moment! in der intern.php taucht eine datei auf, die noch nicht besprochen wurde, die val_logn.php.

val_login.php

PHP-Code:

<?php
//prüfen, ob die session "logged" FALSE ist
if($_SESSION['logged'] == FALSE)
{
//wenn FALSE, dann zum login-formular weiterleiten
header('location: login.html');
exit();
}
?>
zuguterletzt müsst ihr euch auch noch ausloggen können.

logout.php

PHP-Code:

<?php
session_start();

//die sessions auf FALSE setzen
$_SESSION['logged'] = FALSE;
$_SESSION['u_name'] = FALSE;

//zum login-formular weiterleiten
header('location: login.html');
?>

ach ja, es fehlt noch die begründung der 33 stellen im passwort-feld.
aus sicherheitsgründen wird das passwort eines benutzers in der datenbank verschlüsselt, hierzu wird die funktion md5() genutzt. sie verschlüsselt auf 32 bit, belegt als genau 32 stellen.
wenn man etwas md5-verschlüsselt ausgeben will, nutzt man einfach folgenden code-schnippsel:

PHP-Code:

<?php
echo md5('mich muss man verschlüsseln');
?>

so, ich hoffe, ich habe euch den das login-system etwas näher gebracht. dieses system ist sofort einsatzbereit und auf fehler geprüft.
sollte irgendetwas unklar sein, berichtet es mir und ich werde es editieren.

Nils aka XraYSoLo

Quelle: http://www.php.de/forum/webentwicklung/php-fortgeschrittene/105-ein-login-system-basierend-auf-mysql-und-sessions