Avatar billede junold Nybegynder
26. september 2007 - 14:34 Der 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?
Avatar billede plx Nybegynder
26. september 2007 - 14:52 #1
#(?=.{8})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])#

* mindst 8 tegn
* mindst et tal
* mindst et lille bogstav
* mindst et stort bogstav
Avatar billede nielle Nybegynder
26. september 2007 - 14:56 #2
#^(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])$#
Avatar billede plx Nybegynder
26. september 2007 - 14:59 #3
^ og $ er overflødige, da punktum alligevel matcher alt
Avatar billede nielle Nybegynder
26. september 2007 - 15:08 #4
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:

* Kun bogstaver eller tal.

{8,} - signalere bedre "mindst 8 tegn".
Avatar billede plx Nybegynder
26. september 2007 - 15:28 #5
Der kan vel dårligt være ulovlige tegn i et password. Det må være op til brugeren, hvor bøvlet det skal være at indtaste
Avatar billede junold Nybegynder
26. september 2007 - 16:03 #6
Fedest! Men kan du ikke lige forklare koden step by step?
Avatar billede plx Nybegynder
26. september 2007 - 17:10 #7
(?=...) 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
Avatar billede nielle Nybegynder
26. september 2007 - 18:02 #8
(?=...) 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:

#^(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])((?![ <>]).)*$#
Avatar billede plx Nybegynder
26. september 2007 - 18:54 #9
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.
Avatar billede junold Nybegynder
27. september 2007 - 10:29 #10
Fedest! Så giver det mening, jeg synes det var så svært at overskue! Mange tak! Svar for at få point plx. ;) Også tak til nille.
Avatar billede nielle Nybegynder
07. oktober 2007 - 11:18 #11
Det lyder som om at plx skal smide er svar? :^)
Avatar billede junold Nybegynder
29. marts 2008 - 22:32 #12
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester