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 Snippets
array_find, array_any und array_all in PHP 8.4 – Arrays durchsuchen ohne Schleife
„Gibt es einen inaktiven Eintrag?", „Sind alle bezahlt?", „Hol mir den ersten Treffer" – dafür hast du bisher eine foreach-Schleife mit break geschrieben. PHP 8.4 macht daraus je eine Zeile, die genau sagt, was sie meint.
First-Class-Callable-Syntax in PHP: aus strlen(...) wird ein echter Wert
Funktionen als Zeichenketten weiterzureichen – 'strlen', [$objekt, 'methode'] – hat nie jemand gemocht: kein Tippfehlerschutz, keine Sprungmarke in der IDE. Seit PHP 8.1 schreibst du drei Punkte und bekommst ein Closure-Objekt.
Dateirechte verstehen – was 755 und 644 wirklich bedeuten
chmod 777 löst jedes Rechteproblem – und schafft ein größeres. Die drei Ziffern sind kein Zauberspruch, sondern eine simple Addition. Wer sie einmal verstanden hat, rät nie wieder.