Passwörter sicher speichern mit password_hash()
Niemals Passwörter im Klartext oder mit MD5 speichern. Mit password_hash() und password_verify() macht PHP das Richtige von selbst – inklusive Salt und späterem Rehash.
Wenn du in PHP einen Login baust, ist die wichtigste Regel: Passwörter werden niemals im Klartext gespeichert und niemals mit md5() oder sha1(). PHP bringt dafür seit Version 5.5 alles mit – password_hash() erzeugt einen sicheren Hash inklusive zufälligem Salt, password_verify() prüft ihn.
Beim Registrieren hashen
<?php
// PASSWORD_DEFAULT wählt automatisch den aktuell besten Algorithmus (derzeit bcrypt).
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
// $hash speicherst du in der Datenbank – ein Salt musst du NICHT selbst verwalten,
// es steckt bereits im Hash-String.
$stmt = $db->prepare('INSERT INTO users (email, pass_hash) VALUES (?, ?)');
$stmt->execute([$_POST['email'], $hash]);Beim Login prüfen
<?php
$stmt = $db->prepare('SELECT id, pass_hash FROM users WHERE email = ?');
$stmt->execute([$_POST['email']]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
if ($user && password_verify($_POST['password'], $user['pass_hash'])) {
// Passwort stimmt – Session starten.
session_regenerate_id(true);
$_SESSION['uid'] = $user['id'];
} else {
// Bewusst dieselbe, neutrale Meldung für "E-Mail unbekannt" und "Passwort falsch".
$error = 'E-Mail oder Passwort ist falsch.';
}Automatisch nachziehen
Ein oft vergessener Feinschliff: Wird der empfohlene Algorithmus stärker, kannst du beim erfolgreichen Login prüfen, ob der gespeicherte Hash veraltet ist, und ihn transparent erneuern.
<?php
if (password_needs_rehash($user['pass_hash'], PASSWORD_DEFAULT)) {
$new = password_hash($_POST['password'], PASSWORD_DEFAULT);
$db->prepare('UPDATE users SET pass_hash = ? WHERE id = ?')
->execute([$new, $user['id']]);
}Genau so setze ich Logins in den Websites und CMS-Systemen um, die ich für Selbstständige baue. Wenn du eine sichere Website mit Login brauchst, findest du mich auf bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Rezepte
PDO mit SQLite – sichere Abfragen per Prepared Statement
SQLite ist eine ganze Datenbank in einer Datei – perfekt für kleine Projekte. Mit PDO und Prepared Statements fragst du sie sicher ab, ganz ohne SQL-Injection.
Robustes Bash-Grundgerüst mit set -euo pipefail
Ein Shell-Skript, das bei Fehlern einfach weiterläuft, ist gefährlich. Mit set -euo pipefail und einem sauberen Grundgerüst bricht dein Skript beim ersten Problem sicher ab.
Upsert in SQLite mit ON CONFLICT DO UPDATE
Einfügen oder aktualisieren in einem einzigen Statement – mit ON CONFLICT ... DO UPDATE. Kein vorheriges SELECT, kein Race Condition zwischen Prüfen und Schreiben.