| Passwortstärke prüfen |
Die Stärke eines Benutzerpassworts prüfenMan kann als Entwickler seine Anwendung noch so sicher programmieren, aber wenn Benutzer bei der Registrierung extrem unsichere Passwörter wählen, die leicht zu knacken oder zu erraten sind, eröffnet das den Bösen Buben (Spammer, Hacker, usw.) Tür und Tor um teilweise Schutzmechanismen zu unterwandern. Eine sehr einfache aber effektive Möglichkeit bildet ein Punktesystem. Sobald ein Passwort ein bestimmtes Kriterium für ein sicheres Passwort erfüllt, wird ein Punkt dazu addiert. Ab einer gewissen Punktzahl kann man ein Passwort dann als tauglich akzeptieren. Schauen wir uns nun zunächst einmal unsere HTML Beispielseite an, über die wir ein Passwort an unser Script übermitteln können, ehe wir dann zum PHP Teil kommen. Beispielseite mit Tipps für ein sicheres Passwort<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<title>Formular mit Passwortstärke</title>
</head>
<body>
<h3><?php echo $ausgabe; ?></h3>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
<label for="passwort">Passwort: </label>
<input type="text" name="passwort" id="passwort" value="<?php echo $pw; ?>" />
<input type="submit" name="submit" id="submit" value="OK" />
</form>
<hr />
<h4>Ein sicheres Passwort sollte diese Kriterien erfüllen:</h4>
<ul>
<li>Kleinbuchstaben</li>
<li>Großbuchstaben</li>
<li>Zahlen</li>
<li>Sonderzeichen wie ! ? $ " / ( ] usw.</li>
<li>Zeichenlänge - je länger je besser, mindestens 6 Zeichen, optimalerweise 15 oder mehr Zeichen</li>
<li>Normale Wörter wie Vornamen, Stadtnamen, Gegenstände, usw. vermeiden</li>
</ul>
</body>
</html>Bevor es wieder eMails mit Beschwerden hagelt, hier noch ein Hinweis zum HTML Teil. Das ist nur eine Beispielseite um die Anwendung zu demonstrieren. Ja, es ist mir bewusst, dass man Passwörter nicht in Klartext Textfelder schreibt und dass man auch das Passwort nicht vorausfüllt. ;-) Auf der Seite haben wir eine H3-Überschrift, die über den Status informiert. Je nach übermitteltem Passwort wird hier eine grobe Einschätzung angezeigt, wie unser System das Passwort einstuft. Aus praktischer Sicht wäre hier zu überlegen, dass man z.B. Passwörter mit einer zu niedrigen Wertung ablehnt und darauf besteht das ein sichereres Passwort verwendet wird. Kommen wir zum PHP Teil. Passwortkriterien mit RegEx überprüfenDer PHP Code ist sehr überschaubar, da er im Prinzip nur aus einigen IF-Abfragen und einer Switch für die Statusmeldung besteht. // Variablen initialisieren $ausgaben = ''; $staerke = 0; $pw = ''; // Prüfen ob das Formular abgeschickt wurde if (isset( $_POST['submit'] ) AND !empty( $_POST['passwort'] )) { /************************************/ /* Qualität des Passworts ermitteln */ /************************************/ // Passwort umladen um nachfolgend etwas Tipparbeit zu sparen ;-) $pw = $_POST['passwort']; // Prüfen ob Kleinuchstaben enthalten sind if (preg_match( "/[a-z]+/", $pw )) { // Stärkewert erhöhen $staerke++; } // Prüfen ob Großbuchstaben enthalten sind if (preg_match( "/[A-Z]+/", $pw )) { // Stärkewert erhöhen $staerke++; } // Prüfen ob Zahlen enthalten sind if (preg_match( "/\d+/", $pw )) { // Stärkewert erhöhen $staerke++; } // Prüfen ob Sonderzeichen (!, ?, $, Leerzeichen, usw.) enthalten sind if (preg_match( "/\W+/", $pw )) { // Stärkewert erhöhen $staerke++; } // Passwort Standardlänge (mindestens 6 Zeichen, maximal 15 Zeichen) prüfen if (strlen( $pw ) >= 6 AND strlen( $pw ) <= 15) { // Stärkewert erhöhen $staerke++; } // Passwort relativ sichere Länge (mehr als 15 Zeichen) prüfen elseif (strlen( $pw ) > 15) { // Stärkewert um 2 erhöhen, da die Passwortlänge das wichtigste Sicherheitskriterium darstellt $staerke = $staerke + 2; } // Zu kurzes Passwort wird auf niedrigsten Wert herabgestuft elseif (strlen( $pw ) < 6) { $staerke = 1; } } // Meldung für die Ausgabe switch ($staerke) { case 1 : $ausgabe = 'Das Passwort ist sehr schwach.'; break; case 2 : $ausgabe = 'Das Passwort ist schwach.'; break; case 3 : $ausgabe = 'Das Passwort ist OK aber nicht wirklich sicher.'; break; case 4 : $ausgabe = 'Das Passwort ist stark.'; break; case 5 : $ausgabe = 'Das Passwort ist sehr stark.'; break; case 6 : $ausgabe = 'So und nicht anders sollte ein sicheres Passwort aussehen!'; break; default: $ausgabe = 'Bitte ein Passwort eingeben.'; break; } Der Code ist schnell erklärt. Zunächst initialisieren wir einige benötigte Variablen. Danach wird geprüft, ob das Formular abgeschickt wurde und falls Ja prüfen wir das Passwort mit unseren Regulären Ausdrücken. Es wird geprüft ob das Passwort beinhaltet:
Wie erwähnt gehe ich jetzt nicht genauer auf die verwendeten RegEx ein, da das ein sehr komplexes Thema ist. Wer sich näher damit beschäftigen möchte -früher oder später führt kein Weg an RegEx vorbei, wenn man ernsthaft programmieren möchte- findet in meiner Linksammlung auf Learn The F***ing Basics auch Links zum Thema RegEx. Auf der Seite LTFB.de habe ich zu Themen rund um die Webentwicklung handverlesene Links veröffentlicht, die zu Seiten mit ganz besonders hochwertige und anfängerfreundliche Tutorials führen. So weit diese kurze Off Topic Information. Nun, wie funktioniert das Punktesystem? Wie üblich findet man auf der Demo Seite das funktionierende Script und kann selbst einmal testen, wie das Punktesystem bei verschiedenen Passwörtern reagiert. Noch ein Hinweis: das Script speichert nichts ab, also kann man die Demo auch verwenden um die eigenen Passwörter einmal grob zu prüfen. Das hier vorgestellte System soll nicht das ultimative Rating System darstellen. Es gibt Passwortstärke Tools da draußen die so aufgebläht und überladen sind, dass sie einem die halbe Applikation lahm legen, weil sie probieren etwas zu perfekt zu sein. Für eine grobe Einschätzung eines Passworts reicht die hier gezeigte Variante vollkommen aus. Bis zum nächsten Quick Tip, Eine live Demo und den vollständigen Code findest Du auf der phpBuddy.eu Demo Seite. |