26. september 2007 - 14:34Der er
11 kommentarer og 1 løsning
PHP preg_match
Jeg har problemer med at forstå hvordan man bruger preg_match. Hvis jeg har et password, der skal valideres.Det skal indeholde mindst 8 tegn, hvoraf mindst et er tal og to er bogstaver og hvor mindst ét af bogstaverne er uppercase og mindst ét af bogstaverne er lowercase.
Jeg har tænkt mig at bruge preg_match og strlen.
Indtil videre, har jeg prøvet denne: f(!preg_match('#[a-zA-Z\d]*[A-Z][a-zA-Z\d]*[0-9\d]*#', $pass))
Men er der nogen der kan forklare hvorden strengen hænger sammen? Og hvordan man tilføjer de andre krav i den?
Uden . sikre du dig ikke imod "ulovlige tegn" (men det mangler der vist under alle omstændigheder et tjek for). Jeg formoder at der er en underforstået bullet som skulle have lydt:
(?=...) er en lookahead. Den fanger ingen tegn, så du kan have flere efter hinanden. Man kan måske sige de "lægger" sig oven på hinanden.
#^\d[a-z]$#
lægger sig f.eks. ikke oven på hinanden. Dvs rækkefølgen er vigtig: tallet SKAL stå før bogstavet.
Så er det bare at nedbryde hver lookahead:
(?=.{8}) bestemmer længden. Minimum 8 (alle tegn) (?=.*\d) x antal vilkårlige tegn, og et ciffer (?=.*[a-z]) x antal vilkårlige tegn, og et lille bogstav (?=.*[A-Z]) x antal vilkårlige tegn, og et Stort bogstav
x antal vilkårlige tegn: hver lookahead begynder fra start, så det er vigtigt, at fortælle der godt kan stå noget foran
(?=...) kaldes en "positive lookahead". Der er også en negativ variant. Den positive variant matcher kun hvis det på "..." matcher strengen. Det er altså den logik, som sikre at de indtastede passwords skal opfylde de enkelte delkrav.
Plx kan have en pointe når han skriver at "der kan vel dårligt være ulovlige tegn i et password". Jeg tillader mig dog alligevel at antage at du muligvis er af en anden mening. Vil du f.eks. tillade mellemrum? Eller et af tegnene '<' og '>'? For ellers skal du til at bekymre dig om folk forsøger at skrive html-tags i deres passwords – kun relevant hvis du nogen sinde forsøger at udskrive passwords.
Plx's løsning kan sagtens udvides til at tage højde for den slags:
Hvis man absolut skal udskrive passwordet, så gør man vel, som man gør med alt andet, der kommer udefra, og html encoder det. Problem løst.
Og hvis det kommer så vidt, så er det vel kun til brugeren selv, at det bliver udlæst, og så er det ret begrænset hvad man får ud af html/javascript injektion.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.