Regular Expression für Kennwortkomplexität

Dolphon

Erfahrenes Mitglied
Hi,

ich bräuchte einmal Eure Hilfe, bei der Überprüfung ob eine Kennwort der Kennwortkomplexiätt entspricht.

d.h.

- min 6 Zeichen
- Großbuchstaben
- Kleinbuchstaben
- Zahlen 0-9
- Sonderzeichen
- Kontoname z.B test darf nicht im PW vorkommen

Bis auf die letzten beiden Punkte habe ich es bereits realisiert.

Hier einmal mein Ansatz(wobei das mit den Sonderzeichen nicht klappt)

PHP:
if(
&& strlen($_POST['password'])>5
&& preg_match('`[A-Z]`',$_POST['password'])
&& preg_match('`[a-z]`',$_POST['password']) 
&& preg_match('`[0-9]`',$_POST['password'])
&& preg_match('`[!§$%&/()=?+#-^°\?]`',$_POST['password'])
){ ......}

Gruß

Dolphon
 
PHP:
if(
&& strlen($_POST['password'])>5
&& preg_match('`[A-Z]`',$_POST['password'])
&& preg_match('`[a-z]`',$_POST['password']) 
&& preg_match('`[0-9]`',$_POST['password'])
&& preg_match('#[!-/:-@\[-`{-~]#',$_POST['password'])
&& $_POST['password'] != $_POST['username']
){ ......}

Optional kannst du auch folgendes Probieren:
PHP:
...
&& preg_match('#[^a-zA-z0-9]#',$_POST['password'])
...


Proberis mal so, kann es leider nicht testen, da ich hier atm kein php habe.

Gruß
BK
 
Zuletzt bearbeitet:
Oh. Warum RegExp?
Würde ich ganz bequem so lösen:
PHP:
$s = "passwort";
if ...
(strtolower($s) == $s) // Keine Großbuchstaben
(strtoupper($s) == $s) // Keine Kleinbuchstaben
(htmlentities($s) == $s) // Keine Sonderzeichen
(ctype_alpha($s)) // Nur Buchstaben
(strpos($s, $username) !== false) // Benutzername ist drin

Hier wurde die Voraussetzung für Zahlen etwas Unterschlagen, aber dafür findet sich sicherlich noch ein Weg.
 
Zuletzt bearbeitet:
Oh. Warum RegExp?
Würde ich ganz bequem so lösen:
PHP:
$s = "passwort";
if ...
(strtolower($s) == $s) // Keine Großbuchstaben
(strtoupper($s) == $s) // Keine Kleinbuchstaben
(htmlentities($s) == $s) // Keine Sonderzeichen
(ctype_alpha($s)) // Nur Buchstaben

Hier wurde die Voraussetzung für Zahlen etwas Unterschlagen, aber dafür findet sich sicherlich noch ein Weg.

Hallo,

bei deiner Lösung wären aber z.B. folgende Zeichen keine Sonderzeichen:

? ! / \ - . ,

usw. ;)

Gruß
BK
 
Ich würde die Eigenschaften einzeln bewerten, beispielsweise:
PHP:
$props = array(
	'upperCaseLetters' => preg_match('`[A-Z]`', $_POST['password']),
	'lowerCaseLetters' => preg_match('`[a-z]`', $_POST['password']),
	'numbers'          => preg_match('`[0-9]`', $_POST['password']),
	'specialChars'     => preg_match('`[^A-Za-z0-9]`', $_POST['password'])
);
Dann kannst du auch gezielt Verbesserungsvorschläge geben:
PHP:
$labels = array(
	'upperCaseLetters' => 'Großbuchstaben',
	'lowerCaseLetters' => 'Kleinbuchstaben',
	'numbers'          => 'Ziffern',
	'specialChars'     => 'Sonderzeichen'
);
if (array_sum($props) < count($props)) {
	echo 'Das eingegebene Passwort scheint nur aus ';
	$has = array_filter($props);
	$hasKeys = array_keys($has);
	$lastHasKey = array_pop($hasKeys);
	if (!empty($hasKeys)) {
		echo '<b>', $labels[array_shift($hasKeys)], '</b>';
		foreach ($hasKeys as $key) {
			echo ', <b>', $labels[$key], '</b>';
		}
		echo ' und ';
	}
	echo '<b>', $labels[$lastHasKey], '</b>';
	echo ' zu bestehen. Sie können es verbessern, indem sie noch ';
	$hasNotKeys = array_keys(array_diff($props, $has));
	$lastHasNotKey = array_pop($hasNotKeys);
	if (!empty($hasNotKeys)) {
		echo '<b>', $labels[array_shift($hasNotKeys)], '</b>';
		foreach ($hasNotKeys as $key) {
			echo ', <b>', $labels[$key], '</b>';
		}
		echo ' und ';
	}
	echo '<b>', $labels[$lastHasNotKey], '</b>';
	echo ' verwenden.';
} else {
	echo 'Ihr Passwort verwendet ';
	$labelKeys = array_keys($labels);
	$lastLabelKeys = array_pop($labelKeys);
	if (!empty($labelKeys)) {
		echo '<b>', $labels[array_shift($labelKeys)], '</b>';
		foreach ($labelKeys as $key) {
			echo ', <b>', $labels[$key], '</b>';
		}
		echo ' und ';
	}
	echo '<b>', $labels[$lastLabelKeys], '</b>.';
}
 
Besten Dank für die ausführliche Verbesserung .

Ein Punkt fehlt mir allerdings noch.
Das das Kennwort nicht gleich dem Benutzernamen sein soll, sollte klar sein, aber ich will, das der Benutzername im Kennwort garnicht vorkommen darf.
Soll heißen "45!benutzernamelo§" soll auch ungültig sein, da benutername in Kenwort vorkommt.
Dieser Fall wird hiermit leider nicht erfüllt:

PHP:
$_POST['password'] != $_POST['username']
 
Zurück