Hallo!
Ich habe mir für meine Webseite mal ein Login Skript gebastelt. Für meine Bedürfnisse funktioniert es im Moment perfekt. Aber vielleicht findet ihr ja noch ein paar Fehler oder eventuelle Sicherheitslücken.
So sieht meine Klasse aus.
Also da ist jetzt schon eine Umleitung mit eingebaut, die ich gleich noch erkläre. Außerdem benutze ich die Template-Engine Haanga. Das Formular, was in der login.html steht, sieht einfach so aus:
Wenn ich eine Seite also durch diese Login Klasse schützen möchte schreibe ich einfach folgendes ganz als erstes in den PHP-Code rein.
Wenn nun beispielsweise die Seite index.php aufgerufen wird, so wird in der check-Login Funktion zwischengespeichert, von welcher Seite man gekommen ist, also hier die index.php. Nach erfolgreichem Login wird man dann einfach zu der Seite umgeleitet, die man angucken wollte. Was haltet ihr von der Klasse?
Ich habe mir für meine Webseite mal ein Login Skript gebastelt. Für meine Bedürfnisse funktioniert es im Moment perfekt. Aber vielleicht findet ihr ja noch ein paar Fehler oder eventuelle Sicherheitslücken.
So sieht meine Klasse aus.
PHP-Code:
class Login {
public function __construct() {
session_start();
}
public function login($username, $password) {
try {
//Datenbankverbindung aufbauen
$db = new PDO('mysql:host='.MYSQL_HOST.';dbname='.MYSQL_DB, MYSQL_USER, MYSQL_PASSWORD);
//Error-Modus auf Exception umstellen
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $db->prepare("SELECT id, user, password FROM benutzer WHERE user = :form_username AND password = :form_password");
//Variablen im prepared Statement belegen und nach User und Password suchen
$stmt->bindParam(':form_username', $username, PDO::PARAM_STR);
//Passwort mit dem sha1 Hash verschlüsseln
$stmt->bindParam(':form_password', sha1($password), PDO::PARAM_STR, 40);
$stmt->execute();
$user_id = $stmt->fetchColumn();
$db = null;
if($user_id) { //falls eine ID zu User und Passwort gefunden wurde
$_SESSION['user_id'] = $user_id;
session_regenerate_id(); //SID regenerieren, um Session Fixation zu verhindern
} else {
$_SESSION['error'] = "Benutzername oder Passwort falsch"; //Errorcode in Session ablegen
}
} catch (PDOException $e) {
$_SESSION['error'] = "Verbindung zu Datenbank fehlgeschlagen";
}
}
public function checkLogin() {
if(!isset($_SESSION['user_id'])) { //wenn nicht authorisiert
$referrer = basename($_SERVER['PHP_SELF']); //zwischenspeichern, welche Seite aufgerufen werden sollte
$error = "";
if ($_SERVER['QUERY_STRING'] != "") {
$referrer .= "?" . $_SERVER['QUERY_STRING']; //auch den Query-String zwischenspeichern
}
if (isset($_SESSION['error']))
$error = $_SESSION['error'];
unset($_SESSION['error']); //Errorcode wieder zurücksetzen
$vars = compact('referrer', 'error');
Haanga::Load('login.html', $vars); //Template aufrufen
exit; //alle weiteren Skripte werden gestoppt, da man nicht eingeloggt ist
}
}
public function logout() {
setcookie(session_name(), '', time()-3600,'/');
session_destroy();
}
}
if(isset($_POST['login_submit'])) {
$login = new Login();
//GET-Variablen von HTML-Tags befreien
$user = filter_input(INPUT_POST, 'user', FILTER_SANITIZE_STRING);
$pass = filter_input(INPUT_POST, 'user_pass', FILTER_SANITIZE_STRING);
$login->login($user, $pass); //einloggen, falls Daten stimmen
header("Location: ". $_POST['referrer'] .""); //zu der Seite umleiten, die ursprünglich hätte aufgerufen werden sollte
}
if (isset($_POST['logout'])) {
$login = new Login();
$login->logout();
header("Location: index.php"); //zur Startseite umleiten
}
HTML-Code:
<div id="login"> {% if error %} <div id="login_error">{{ error }}</div> {% endif %} <form action="login.php" method="post"> <p><label for="user">Benutzername:</label><br /> <input name="user" id="user" type="text" /></p> <p><label for="user_pass">Passwort:</label><br /> <input name ="user_pass" id="user_pass" type="password" /></p> <input name="login_submit" id="submit_button" type="submit" value="Einloggen" /> <input name="referrer" type="hidden" value="{{ referrer }}"> </div>
PHP-Code:
require_once "login.php";
$login = new Login();
$login->checkLogin();
Kommentar