Egil Dybdal Skrevet 9. oktober 2015 Del Skrevet 9. oktober 2015 (endret) Var ikke helt lett å få preg_match til å fungere slik jeg ønsker. Behøver 2 stk preg_match mønstre: 1. kontroll av brukernavn:- må bestå av minst 1 stor eller liten bokstav- store og små bokstaver er tillatt- alle tall er tillatt- kun tillatt med følgende spesialtegn: ! @ # + _ -- ingen mellomrom er tillatt- ingen krav til maksimum eller minimum lengde 2. kontroll av passord:- må bestå av minst 1 stor bokstav - må bestå av minst 1 liten bokstav - må bestå av minst 1 tall eller spesialtegn - kun tillatt med følgende spesialtegn: ! @ # $ % & = + ? _ - * - ingen mellomrom er tillatt- ingen krav til maksimum eller minimum lengdeNoen som er god på dette? =) Endret 9. oktober 2015 av Egil Dybdal Lenke til kommentar
Lanes Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 (endret) Satte sammen noe, ser ut til å fungere etter kravene dine. Du får teste litt mer og gi tilbakemelding. Benytter lookahead for å sjekke at stringen inneholder gitte kriterier, deretter sjekker vi at stringen kun inneholder spesifikke symboler. Brukernavn ^(?=.*[A-Z]|[a-z])([A-Z]|[a-z]|[!@#+_\-]|\d)*$ Passord ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&=+?_\-*])([A-Z]|[a-z]|[!@#$%&=+?_\-*]|\d)+$ Det finnes dog derimot bedre løsninger enn strenge passordregler (din var jo ikke så ille, men spørs hvor ofte du vil be bruker om å bytte. http://thedailywtf.com/articles/Security-by-PostIt ) Endret 10. oktober 2015 av Lanes Lenke til kommentar
Thorbear Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Satte sammen noe, ser ut til å fungere etter kravene dine. Du får teste litt mer og gi tilbakemelding. Benytter lookahead for å sjekke at stringen inneholder gitte kriterier, deretter sjekker vi at stringen kun inneholder spesifikke symboler. Brukernavn ^(?=.*[A-Z]|[a-z])([A-Z]|[a-z]|[!@#+_\-]|\d)*$ Passord ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%&=+?_\-*])([A-Z]|[a-z]|[!@#$%&=+?_\-*]|\d)+$ Det finnes dog derimot bedre løsninger enn strenge passordregler (din var jo ikke så ille, men spørs hvor ofte du vil be bruker om å bytte. http://thedailywtf.com/articles/Security-by-PostIt ) En god start på regulære uttrykk det der, men det ser ut som det kan være verdt å nevne at om du har flere tegnklasser med `|` mellom så kan disse slåes sammen til én tegnklasse. Dette gjør også at du kan droppe noen grupperinger som bare er i veien. Brukernavn: ^(?=.*[A-Za-z])[A-Za-z0-9!@#+_-]+$ For passord ser det også ut som at du endret kravet hans om "minst ett tall eller spesialtegn" til "minst ett tall og minst ett spesialtegn" Passord: ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9!@#$%&=+?_*-])[A-Za-z0-9!@#$%&=+?_*-]+$ Lenke til kommentar
Lanes Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 Tenkte det var greit å lage egne tegnklasser for lesbarhetens skyld, men det gjorde vel egentlig bare ting mer rotete. Endringen i passord var en glipp. Burde lest kravene bedre. Lenke til kommentar
Egil Dybdal Skrevet 10. oktober 2015 Forfatter Del Skrevet 10. oktober 2015 Suverent! Takker for gode eksempler. Tror jeg begynner å se sammenhengen hvordan man lager grupperingene i mønsteret. Det var hele tiden ett eller annet jeg ikke fikk til å fungere i forhold til ønskede kriterier. Nå ser det ut til at det fungerer som ønsket! Lenke til kommentar
Egil Dybdal Skrevet 10. oktober 2015 Forfatter Del Skrevet 10. oktober 2015 Jeg trodde jeg hadde dette under kontroll nå, men jeg tok feil Brukernavn valideringen fungerte ikke slik som ønsket likevel. Foreløpig kode: $input_username = ""; function validate_input($validate_data) { $validate_data = trim($validate_data); $validate_data = stripslashes($validate_data); $validate_data = htmlspecialchars($validate_data); return $validate_data; } $input_username = validate_input($_POST['username']); $username_check = mysql_real_escape_string($input_username); $username_strlen = strlen($input_username); if($username_strlen > 3) { if(!preg_match('^(?=.*[A-Za-z])[A-Za-z0-9!@#+_-]+$', $input_username)) { Kriterier:- minimum 4 tegn- minst 1 stor eller liten bokstav- mellomrom er ikke tillatt- brukernavn kan ellers bestå av store bokstaver, små bokstaver, tall, eller følgende spesialtegn: ! $ # + _ -Når jeg tester, så godtar scriptet følgende brukernavn:§§§øæø-12312341[space][space]2 [space] = mellomromJeg har ikke testet så mange flere kombinasjoner, siden scriptet likevel ikke fungerer slik jeg ønsker. Ingen av de overnevnte kombinasjonene skal godtas.Jeg har prøvd å printe variabelen $input_username direkte til skjerm, og output til skjem viser samme data som jeg skriver inn i input feltet. Filene er lagret som UTF-8. $username_strlen = strlen($input_username) Denne fungerer ikke som ønsket, da to stk spesialtegn blir kalkulert som 4 tegn. (!preg_match('^(?=.*[A-Za-z])[A-Za-z0-9!@#+_-]+$', $input_username)) Fungerer heller ikke som ønsket, da brukernavn kan bestå av både mellomrom, æøå, en rekke spesialtegn som ikke er inkludert, og brukernavn behøver tydeligvis ikke å inneholde noen bokstaver. (!preg_match('/[^A-Za-z0-9!@#_-]/', $input_username)) Dette var utgangspunktet mitt da jeg forsøkte på egenhånd. Denne fungerer til den grad at mellomrom blir ikke akseptert, og spesialtegn som ikke er nevnt blir ikke akseptert. Problemet er at denne kontrollerer ikke at brukernavn inneholder minst en stor eller liten bokstav.Var ikke så lett å forstå seg på det her likevel. :/ Lenke til kommentar
Egil Dybdal Skrevet 10. oktober 2015 Forfatter Del Skrevet 10. oktober 2015 Glemte å nevne:Grunnen for at jeg kjører kontroll av lengde på brukernavn i egen funksjon er å kunne gi tilbakemelding om at brukernavnet er for kort. Dersom brukernavn er minst 4 tegn, skal brukernavnet kontrolleres for tegnsammensetting, hvor det eventuelt gis tilbakemelding om at brukernavnet ikke er akseptert. Lenke til kommentar
Thorbear Skrevet 10. oktober 2015 Del Skrevet 10. oktober 2015 (endret) Her var det plutselig mye rart på en gang ja. Hvorfor benytter du trim(), stripslashes(), og htmlspecialchars() på inndata? Vet du hva disse funksjonene er til? Hvorfor benytter du mysql_real_escape_string() ? Riktignok bruker du ikke resultatet til noe i den kodesnutten vi ser, men dette er et tegn på at du kanskje benytter mysql_query() seinere i koden, ikke bra. Som du kanskje legger merke til, så har ditt opprinnelige regulære uttrykk en `/` i begge ender, mens uttrykkene du har fått her begynner med `^` og slutter med `$`. Denne forskjellen er fordi preg_match() forventer at du skal bruke såkalte avgrensningstegn, som brukes for å skille det regulære uttrykket fra modifikator-flagg. Uttrykkene du har fått her har ingen slike tegn, fordi det ikke er en del av regulære uttrykk i seg selv. Sleng på en `/` foran og bak, så skal du se ting flyter bedre. Edit: Dette kunne forøvrig også oppdages ved å sjekke retur-verdien av preg_match(), som returnerer FALSE dersom det oppstår en feil, men bare 0 eller 1 dersom alt gikk som det skal. Jeg ser også ved en nærmere kikk at du har en `!` foran preg_match() og at det opprinnelige uttrykket ditt har en `^` som første tegn i tegnklassen. Er dette ting du har kontroll på, eller trengs det litt mer forklaring av hvordan regulære uttrykk fungerer? Endret 11. oktober 2015 av Thorbear Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå