Hallo Rolf,
Aber der Meckerfritze ist wieder da 😉
So soll es aber auch sein. Schließlich wächst man nicht am Lob, sondern an der Kritik. Besonders, wenn sie so konstruktiv ist.
Arrays in $_POST kommen ja nur vor, wenn Du das im Form so vorsiehst, oder Dir irgendwer das bösartig hineinpostet. Heißt: Wenn Du vorhast, in deinem Login- oder Register-Form Passwort-Arrays einzubauen, dann überlege Dir, wie Du damit umgehen müsstest. Wenn Du das nicht vorhast, weise sie als manipulierte Eingabe zurück.
Grundsätzlich kommen vom Form nur Strings an, jedoch habe ich im Controller das Passwort und das Kontrollpasswort in ein Array gesetzt, da ich das so übersichtlicher fand.
Methode hash:
Die Methode nutze ich erst nach der Passwortvalidierung, da kommt nun gar nicht erst ein Array an:
public static function hash(string $plain_password): string
{
return password_hash($plain_password, PASSWORD_DEFAULT);
}
und das User-Objekt macht dann vor dem Speichern in der Datenbank:
# Entity/User.php
...
return PasswordService::hash($this->password);
...
Methode verify:
Diese Methode kommt dann erst beim Login zum Einsatz:
public static function verify(string $plain_password, string $correct_hash): bool
{
return password_verify($plain_password, $correct_hash);
}
Methode isString:
Kommt das Passwort als Array (Passwort und Kontrollpasswort), soll jedes auf String überprüft werden.
private static function isString($password): bool
{
if(is_array($password) && !empty($password)){
$passwordIsString = true;
foreach ($password as $item){
$passwordIsString = is_string($item);
}
return $passwordIsString;
} else {
return is_string($password);
}
}
Methode isEqual:
private static function isEqual(array $password): bool
{
return ($password[0] === $password[1]);
}
Methode hasMinLength:
Hier reicht es, meiner Meinung nach, nur das Passwort auf Länge zu prüfen, da das Kontrollpasswort sowieso identisch sein muss.
private static function hasMinLength($password): bool
{
$password = is_array($password) && !empty($password) ? array_pop($password) : $password;
return (strlen($password) > 7);
}
Methode isComplex:
Hier soll auch nur das Passwort, nicht das Kontrollpasswort, sollte es sich um ein Passwort-Array handeln, überprüft werden. Bin mir noch nicht sicher, ob ich das so richtig gemacht habe:
private static function isComplex($password): bool
{
try{
$password = (is_array($password) && !empty($password)) ? array_pop($password) : $password;
$pregMatch = (preg_match('/^(?=.*\d)(?=.*[@#\-_$%^&+=§!\?])(?=.*[a-z])(?=.*[A-Z])[0-9A-Za-z@#\-_$%^&+=§!\?]{8,20}$/',$password));
if (false === $pregMatch){
throw new Exception();
}
return $pregMatch;
} catch (Exception $exception){
(new Logger)->newMessage($exception);
(new Logger)->customErrorMsg($exception);
}
}
Sorry für die lange Liste...
ich kann mich nur für die Unterstzütung und Mühe bedanken.
Beste Grüße
vapita