Hallo,
ich bin sicher nicht der erste, der über diesem Problem grübelt, finde aber leider keine passende Lösung im Netz. Bei meinem Versuch komme ich jetzt nicht mehr weiter. Würde mir bitte jemand helfen?
Gegeben ist ein String, der später mal zu einem Passwort werden soll. Doch dazu muss der String bestimmte Bedingungen erfüllen. Ich scheitere beim Test auf diese Bedingungen. Wenn der String nicht alle Bedingungen erfüllt, soll eine Fehlermeldung erzeugt werden.
Die zu erfüllenden Bedingungen sind:
- der String muss mindestens 7 Zeichen lang sein (länger als 20 Zeichen kann er nicht sein, das das Eingabefeld nur 20 lang ist)
- gültige Zeichen sind: Ziffern (0-9), Buchstaben (a-z bzw. A-Z) sowie ~!@#%_+-{}[]:,.?/*
- andere Zeichen (z.B. Umlaute, Leerzeichen, usw.) sind im String nicht erlaubt
- das erste Zeichen im String muss eine Ziffer oder ein Buchstabe sein
- innerhalb der ersten 8 Zeichen müssen mindestens 4 Buchstaben enthalten sein (Wieviele davon Gross- bzw. Kleinbuchstaben sind, ist nicht relevant.)
- es muss innerhalb der ersten 8 Zeichen mindestens eine Ziffer oder ein oben genanntes Sonderzeichen enthalten sein
- innerhalb der ersten 8 Zeichen darf kein Zeichen öfter als dreimal vorkommen
Mein Versuch (die nachfolgenden Zeilen) geht zwar schon in die richtige Richtung, testet aber nicht weit genug. Außerdem geht's sicher schöner, kürzer, lesbarer, ... Aber weiter weiß ich nicht. Es würde mir reichen, wenn's funktioniert.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use strict;
use CGI;
...
# Fehlertext leer setzen
my $Fehlertext = '';
# neues (spaeteres) Passwort einlesen
my $Neupw1 = $cgi->param($Feldnamen[2]);
...
# nimm aus $Neupw1 beginnend bei Position 0 die ersten 8 Zeichen als $Neupw1kurz
my $Neupw1kurz = substr($Neupw1,0,8);
# $SortedNeupw1kurz ergibt sich aus dem umsortierten $Neupw1kurz (gleiche Buchstaben stehen hintereinander)
my $SortedNeupw1kurz = join('',sort(split(//,$Neupw1kurz)));
# jetzt der eigentliche Test
if(( $Neupw1kurz !~ /^(?=.*[a-zA-Z].*[a-zA-Z].*[a-zA-Z].*[a-zA-Z])(?=.*[^a-zA-Z])\S{7,8}$/) || $SortedNeupw1kurz =~ /(.)\1{3,}/)
{ $Fehlertext .= 'Das neue Passwort entspricht nicht den Sicherheitsrichtlinien!'; }
...
Ist
$Fehlertext leer, sind alle Bedingungen erfüllt und der String kann als Paßwort verwendet werden. Ist er nicht leer, so wird der Fehlertext dem Nutzer präsentiert, der dann einen neuen String eingeben kann.
Ich würde mich freuen, wenn mir jemand helfen würde.
Danke,
Volker
Last edited: 2014-04-25 14:33:51 +0200 (CEST)