Smakløs validering php. Validering og datarensing ved hjelp av PHP. Registrering av din egen valideringsregel

Når du bygger webapplikasjoner er det viktig å ta sikkerhet på alvor, spesielt når du skal forholde deg til innhenting av data fra brukere.

En generell sikkerhetsregel er å stole på ingen, så du kan ikke stole på at brukere alltid legger inn de riktige verdiene i skjemaer. For eksempel, i stedet for å skrive inn riktig e-postadresse i feltet, kan brukeren skrive inn en feil adresse, eller til og med noen ondsinnede data.

Når det gjelder validering av brukerdata, kan det gjøres enten på klientsiden (i nettleseren) eller på serversiden.

Tidligere kunne validering på klientsiden bare gjøres med JavaScript. Men alt har endret seg (eller nesten endret), siden ved hjelp av HTML5 kan validering gjøres i nettleseren, uten å måtte skrive komplekse valideringsskript i JavaScript.

Skjemavalidering ved hjelp av HTML5

HTML5 gir en ganske robust mekanisme basert på følgende tag-attributter: type, pattern og require. Med disse nye attributtene kan du laste ned noen av datavalideringsfunksjonene til nettleseren.

La oss se på disse attributtene for å forstå hvordan de kan hjelpe med skjemavalidering.

type attributt

Dette attributtet forteller hvilket inndatafelt som skal vises for databehandling, for eksempel det kjente feltet som

Noen inndatafelt har allerede standard valideringsmetoder, uten behov for å skrive tilleggskode. For eksempel sjekker den et felt for å sikre at den angitte verdien samsvarer med malen til en gyldig e-postadresse. Hvis feil tegn legges inn i et felt, kan ikke skjemaet sendes inn før verdien er rettet.

Prøv å leke deg med e-postfeltverdiene i demoen nedenfor.

Det finnes også andre standard felttyper, som , og for henholdsvis validering av numre, URL-er og telefonnumre.

Merk: Telefonnummerformater varierer fra land til land på grunn av forskjeller i antall sifre i telefonnumre og forskjeller i formater. Som et resultat definerer ikke spesifikasjonen en algoritme for å sjekke telefonnumre, så i skrivende stund er denne funksjonen dårlig støttet av nettlesere.

Heldigvis for oss kan telefonnummervalidering gjøres ved å bruke mønsterattributtet, som tar et regulært uttrykk som argument, som vi skal se på neste gang.

mønsterattributt

Mønsterattributtet vil sannsynligvis få mange frontend-utviklere til å hoppe av glede. Dette attributtet godtar et regulært uttrykk (ligner JavaScript-regulære uttrykksformat) som vil bli brukt til å kontrollere riktigheten av dataene som er angitt i feltet.

Regulære uttrykk er et språk som brukes til å analysere og manipulere tekst. De brukes ofte til komplekse søk og erstatningsoperasjoner, samt for å kontrollere riktigheten av innlagte data.

I dag er regulære uttrykk inkludert i de fleste populære programmeringsspråk, så vel som i mange skriptspråk, redaktører, applikasjoner, databaser og kommandolinjeverktøy.

Regulære uttrykk (RegEX) er et kraftig, kortfattet og fleksibelt verktøy for å matche en tekststreng, for eksempel individuelle tegn, ord eller tegnmønstre.

Ved å sende et regulært uttrykk som verdien av mønsterattributtet, kan du spesifisere hvilke verdier som er akseptable for et gitt inndatafelt, samt informere brukeren om feil.

La oss se på et par eksempler på bruk av regulære uttrykk for å validere verdien av inndatafelt.

Telefonnummer

Som nevnt tidligere støttes ikke tel-felttypen fullt ut av nettlesere på grunn av inkonsekvenser i telefonnummerformater i forskjellige land.

For eksempel, i noen land er formatet for telefonnumre xxxx-xxx-xxxx, og selve telefonnummeret vil være noe sånt som dette: 0803-555-8205.

Det regulære uttrykket som dette mønsteret samsvarer med er: ^\d(4)-\d(3)-\d(4)$ . I kode kan dette skrives slik:

Telefonnummer:

Alfanumeriske verdier Attributt kreves

Dette er et boolsk attributt som brukes for å indikere at verdien av et gitt felt må fylles ut for å sende inn skjemaet. Når du legger til dette attributtet i et felt, vil nettleseren kreve at brukeren fyller ut dette feltet før skjemaet sendes inn.

Dette sparer oss for å implementere feltvalidering ved hjelp av JavaScript, noe som kan spare utviklere for litt tid.

For eksempel: eller (for XHTML-kompatibilitet)

Alle demoene du har sett ovenfor bruker det nødvendige attributtet, så du kan prøve det ved å prøve å sende inn skjemaet uten å fylle ut noen felt.

Konklusjon

Nettleserstøtte for skjemavalidering er ganske bra, og for eldre nettlesere kan du bruke polyfills.

Det er verdt å merke seg at det å stole på validering på nettlesersiden alene er farlig, siden disse sjekkene lett kan omgås av angripere eller roboter.

Ikke alle nettlesere støtter HTML5, og ikke alle data som sendes til skriptet ditt kommer fra skjemaet ditt. Dette betyr at før du endelig godtar data fra brukeren, er det nødvendig å kontrollere riktigheten på serversiden.

Det er svært viktig å få inndataene til skjemaet validert før du tar skjemainnsendingsdataene for videre behandling. Når det er mange felt i skjemaet, blir PHP-valideringsskriptet for komplekst. Siden du gjør den samme eller lignende valideringen for de fleste skjemaene du lager, blir det brukt for mye duplikatarbeid på skjemavalideringer.

Om dette generiske PHP-skjemavalideringsskriptet

Dette generiske PHP-skjemavalideringsskriptet gjør det veldig enkelt å legge til valideringer i skjemaet ditt.

Vi oppretter og knytter et sett med "valideringsbeskrivelser" til hvert element i skjemaet. "valideringsbeskrivelsen" er en streng som spesifiserer typen validering som skal utføres. For eksempel betyr "req" nødvendig, "alfa" betyr bare å tillate alfabetiske tegn og så videre.

Hvert felt i skjemaet kan ha null, én eller flere valideringer. For eksempel skal inndata ikke være tomt, skal være mindre enn 25 tegn, skal være alfanumerisk osv.

Du kan knytte et sett med valideringsbeskrivelser for hvert inndatafelt i skjemaet.

Last ned PHP-skjemavalideringsskriptet

Du kan laste ned PHP-skjemavalideringsskriptet nedenfor:
Zip-filen inneholder skjemavalideringsskriptet formvalidator.php, dokumentasjon og brukseksempler.

Bruke PHP-skjemavalideringsskriptet
  • Inkluder formvalidator.php i skjemabehandlingsskriptet ditt
  • require_once "formvalidator.php"
  • Opprett et FormValidator-objekt og legg til skjemavalideringsbeskrivelsene.
  • $validator = new FormValidator(); $validator->addValidation("Navn","req","Vennligst fyll inn Navn"); $validator->addValidation("E-post","e-post", "Input for e-post bør være en gyldig e-postverdi"); $validator->addValidation("E-post","req","Vennligst fyll inn e-post");

    Det første argumentet er navnet på inndatafeltet i skjemaet. Det andre argumentet er valideringsbeskrivelsen som forteller hvilken type validering som kreves. Det tredje argumentet er feilmeldingen som skal vises hvis valideringen mislykkes.

  • Valider skjemaet ved å kalle ValidateForm()-funksjonen
  • if(!$validator->ValidateForm()) ( echo "Validation Errors:"; $error_hash = $validator->GetErrors(); foreach($error_hash as $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) ) Eksempel

    Eksemplet nedenfor vil gjøre ideen klarere

    Navn: E-post:

    Legger til tilpasset validering

    Hvis du vil legge til en tilpasset validering, som ikke er gitt av valideringsbeskrivelsene, kan du gjøre det. Her er trinnene:

  • Opprett en klasse for den tilpassede valideringen og overstyr DoValidate()-funksjonen
  • klasse MyValidator utvider CustomValidator ( funksjon DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="Ingen nettadresser tillatt i kommentarer"; return usant; ) return true; ) )

  • Legg til det tilpassede valideringsobjektet
  • $validator = new FormValidator(); $validator->addValidation("Navn","req","Vennligst fyll inn Navn"); $validator->addValidation("E-post","e-post", "Input for e-post bør være en gyldig e-postverdi"); $validator->addValidation("E-post","req","Vennligst fyll inn e-post"); $custom_validator = ny MyValidator(); $validator->AddCustomValidator($custom_validator);

    Den tilpassede valideringsfunksjonen kalles opp automatisk etter andre valideringer.

    Tabell over valideringsbeskrivelser

    Her er listen over alle valideringsbeskrivelser:

    ValideringsbeskrivelseBruk
    rekvFeltet skal ikke være tomt
    maxlen=???kontrollerer lengden på innlagte data maksimalt. For eksempel, hvis den maksimale tillatte størrelsen er 25, oppgi valideringsbeskrivelsen som "maxlen=25"
    minlen=???kontrollerer lengden på den angitte strengen til det nødvendige minimum. eksempel «minlen=5»
    alnumSjekk dataene hvis de inneholder andre tegn enn alfabetiske eller numeriske tegn
    alnum_sTillater kun alfabetiske, numeriske og mellomromstegn
    numSjekk numeriske data
    alfaSjekk alfabetiske data.
    alfa_sSjekk alfabetiske data og tillat mellomrom.
    e-postFeltet er et e-postfelt og bekrefter gyldigheten av dataene.
    lt=???
    mindre enn=???
    Bekreft at dataene er mindre enn verdien som sendes. Gyldig kun for numeriske felt.
    eksempel: hvis verdien skal være mindre enn 1000, gi valideringsbeskrivelse som "lt=1000"
    gt=???
    større enn=???
    Bekreft at dataene er større enn verdien som er sendt. Gyldig kun for numeriske felt.
    eksempel: hvis verdien skal være større enn 10, gi en valideringsbeskrivelse som "gt=10"
    regexp=???Sjekk med et regulært uttrykk at verdien skal samsvare med det regulære uttrykket.
    eksempel: «regexp=^(1.20)$» tillater opptil 20 alfabetiske tegn.
    ikke velg=??Denne valideringsbeskrivelsen er for utvalgte inndataelementer (lister) Normalt vil valglisteboksene ha ett element som sier "Velg en". Brukeren bør velge et annet alternativ enn dette alternativet. Hvis verdien av dette alternativet er "Velg en", bør valideringsbeskrivelsen være "dontselect=Velg en"
    ikke velgDenne valideringsbeskrivelsen er for avmerkingsbokser. Brukeren skal ikke merke av i boksen. Oppgi verdien av avmerkingsboksen i stedet for ??
    For eksempel, dontselectchk=on
    burdeselchkDenne valideringsbeskrivelsen er for avmerkingsbokser. Brukeren bør velge den gitte avmerkingsboksen. Oppgi verdien av avmerkingsboksen i stedet for ??
    For eksempel burdeselchk=on
    ikke velg radioDenne valideringsbeskrivelsen er for alternativknapper. Brukeren bør ikke velge den angitte alternativknappen. Oppgi verdien av alternativknappen i stedet for ??
    For eksempel, dontselectradio=NO
    velg radioDenne valideringsbeskrivelsen er for alternativknapper. Brukeren bør velge den angitte alternativknappen. Oppgi verdien av alternativknappen i stedet for ??
    For eksempel, selectradio=yes
    selmin=??Velg minst n antall avmerkingsbokser fra en avmerkingsboksgruppe.
    For eksempel: selmin=3
    seloneGjør en radiogruppe obligatorisk. Brukeren bør velge minst ett element fra radiogruppen.
    eqelmnt=???sammenlign to elementer i skjemaet og sørg for at verdiene er de samme For eksempel ‘passord’ og ‘bekreft passord’. Bytt ut ??? med navnet på det andre inngangselementet.
    For eksempel: eqelmnt=confirm_pwd

    Vi vil snakke om validering av POST- eller GET-data, selv om dette i prinsippet også kan brukes på data mottatt med andre metoder, for eksempel informasjonskapsler. Når du utvikler en hvilken som helst nettapplikasjon, må du skrive et grensesnitt for samhandling med brukere og naturlig lage ulike former for brukere for å sende data til serveren. for eksempel kan dette være kommentarer. Jeg tror det er klart og åpenbart for alle at de mottatte dataene må sjekkes for å se om de samsvarer med typen, størrelsen og spesifisert rekkevidde. Først av alt er dette nødvendig for sikkerheten til systemet, nettstedet eller databasen, fordi... Feil overførte data eller en bevisst dårlig utformet forespørsel kan åpne tilgang til en angriper.

    For det andre kan ubekreftede data, hvis feil, forårsake ustabil drift av skriptet, systemet eller hele serveren. Derfor må alle data sjekkes og dobbeltsjekkes; kanskje noen vil si at det ikke er behov for overdreven paranoia, men jeg tror at i denne saken kan det rett og slett ikke være overdrevent.

    Ikke stol på data mottatt fra brukere, under noen påskudd, under noen omstendigheter. Det hender at vi rett og slett er for late til å skrive kode som sjekker de mottatte dataene igjen, eller vi håper at de eksisterende verifiseringsmetodene er nok, som et resultat av at vi gir innrømmelser til oss selv.

    En liten digresjon fra temaet:
    Å jobbe med prosjekter, utvikle og programmere nettsider, scripts og andre systemer tar nesten all min fritid (foruten arbeidstid), med andre ord, jeg gjør dette arbeidet i maksimalt mulig antall timer om dagen. Fra tid til annen er det behov for å teste noe, for moro skyld eller bare for nysgjerrigheten. Som et resultat blir nettsteder laget i all hast, ved hjelp av hjemmelagde motorer eller CMS av eldgamle versjoner, lignende testlaboratorierotter. Selvfølgelig lider alt det ovennevnte av skjevt skrevet kode, mangel på datakontroll og det vrimler rett og slett av forskjellige feil. Faktisk, i de fleste tilfeller, i løpet av en time av eksperimentene mine på slike nettsteder, klarer jeg å finne flere alvorlige sårbarheter, og de fleste av dem ligger i utilstrekkelig validering av de mottatte dataene. I det siste har dette ofte blitt funnet i skript som behandler POST-data mottatt fra JavaScript + Ajax.

    Tilsynelatende tror programmererne som skrev disse skriptene ved hjelp av Ajax at siden alle forespørsler skjer i bakgrunnen, uten brukerens viten eller ganske enkelt uten å laste inn siden på nytt, trenger ikke dataene å bli spesielt sjekket.

    Som regel viser ganske mange av disse manus seg å være så fulle av hull at de uten store anstrengelser klarer å lage et større hull og oversvømme skallet. selvfølgelig utelukkende med det formål å eksperimentere og ingenting mer (administrasjonen av slike nettsteder er alltid informert om eksisterende sårbarheter).

    Jeg tror viktigheten av validering er tydelig for alle. I lang tid skrev jeg den samme kodebiten hver gang, og brukte deretter mine egne dataverifiseringsfunksjoner, hvorav mange var veldig primitive og som regel spredt i forskjellige deler av (inkludert) filer. Snart begynte jeg å bli kjent med PHP-rammeverket Zend, CI, Kohana, som hver implementerte sin egen klasse for å validere data som jeg lånte til prosjektene mine. Til slutt bestemte jeg meg for å skreddersy en av CI-timene etter mine behov, men det viste seg at forfatteren av en av programmeringsbloggene allerede hadde tatt seg av dette. Deretter deler jeg verkene hans, nemlig det modifiserte CodeIgniter-biblioteket.

    La oss se på følgende kode:

    Se kode PHP

    require_once "validator.class.php" ; $validator = new Validator() ; $validator -> set_rules ("navn" , "Ditt navn" , array ("påkrevd" => , "alpha" => ) ); $validator -> set_rules ("e-post", "Din e-post", array ("required" => "Felt %s er påkrevd" , "valid_email" => ) ); if ($validator -> run () ) ( echo "Validation was vellykket" ; ) else ( echo $validator -> get_string_errors () ; )

    Som du kan se fra eksempelet, inkluderer vi klassefilen i den første linjen validator.calss.php til manuset vårt. Deretter lager vi en forekomst av klassen og lagrer objektet til en variabel $validator.
    Bruk deretter metoden $validator->set_rules($field, $label, $rules) angi feltene for validering.

    Denne metoden tar 3 parametere:

  • $felt- navn på valideringsfeltet (verdien av navneattributtet i taggen)
  • $label- navn på valideringsfeltet, vil bli satt inn i feilmeldinger
  • $regler- en rekke valideringsregler, der valideringsregelen brukes som nøkkel, og feilmeldingen for denne regelen brukes som verdi
  • Etter at alle feltene for validering er satt, starter vi validatoren ved hjelp av metoden $validator->run(). Hvis valideringen var vellykket, vil denne metoden returnere verdien EKTE, ellers, hvis det er noen feil, kommer den tilbake FALSK.

    Det er tre metoder for å motta feilmeldinger:

  • get_string_errors()- returnerer alle feilmeldinger som en streng
  • get_array_errors()— returnerer alle meldinger som en matrise, der feltnavnet brukes som nøkkel, og feilbeskrivelsen for dette feltet brukes som verdi.
  • form_error($field)- returnerer en feilmelding for feltet sendt som $field-parameteren
  • Som standard er feilmeldinger pakket inn i en tag . For å angi design, bruk metoden set_error_delimiters($prefix, $suffix). For eksempel slik:

    Feilmeldinger vil nå vises som div med klasse "feil"

    Som du kan se, er alt veldig enkelt.

    Se kode PHP

    $validator -> set_error_delimiters ( " " , " " );

    For å angi valideringsregler kan du bruke metoden set_rules($fields) passere en flerdimensjonal assosiativ matrise. La oss se på et eksempel:

    Se kode PHP

    $rules = array ( array ( "field" => "name" , "label" => "Ditt navn" , "rules" => array ( "required" => "Felt %s er obligatorisk" , "alpha" = > "Felt %s må bare inneholde bokstaver" ), array ( "field" => "e-post" , "label" => "Din e-post" , "rules" => array ( "required" => "Felt % s er required" , "valid_email" => "Felt %s må inneholde en gyldig e-postadresse" ) ) ) ; $validator -> set_rules ($rules);

    Som du kan se, skrev jeg ned de samme valideringsreglene som i det første eksemplet, bare i form av en flerdimensjonal assosiativ array. Du kan bruke hvilken som helst av metodene som passer deg best i en gitt situasjon.

    Så, hvilke valideringsregler støtter denne klassen?

    Jeg tok med til denne klassen de vanligste valideringsreglene som alle møter. Her er en fullstendig liste over disse reglene:

    nødvendigReturnerer FALSE hvis feltet er tomt
    heltallReturnerer FALSE hvis verdien ikke er et heltall
    flyteReturnerer FALSE hvis verdien ikke er en numerisk verdi
    valid_urlReturnerer FALSE hvis verdien ikke er en gyldig URL
    valid_emailReturnerer FALSE hvis verdien ikke er en gyldig e-postadresse
    gyldig_ipReturnerer FALSE hvis IP-adressen ikke er gyldig
    fyrstikkerReturnerer FALSE hvis elementet ikke samsvarer med verdien til et annet feltelement
    alfaReturnerer FALSE hvis elementet inneholder mer enn bare bokstaver
    valid_captchaReturnerer FALSE hvis verdien i sesjonsfeltet ikke er lik verdien til skjemafeltet
    gyldig datoReturnerer FALSE hvis elementet inneholder en ugyldig dato

    De fleste av disse reglene bruker filtre, som ble tilgjengelige i PHP 5.

    Hvis du ønsker det, kan du alltid utvide regelsettet for validering ved å legge til de nødvendige funksjonene til Validator-klassen.

    For å få den behandlede POST-dataverdien, bruk følgende metode:

    Se kode PHP

    Vanligvis kalles denne metoden for å tømme skjemaet ved vellykket behandling av skjemaet.

    God kveld alle sammen (mer som natt - red.anm.). I dag skal vi forbedre den litt. Først, la oss lære hvordan du utfører skjemavalidering i PHP og gjør noen sikkerhetsmanipulasjoner.

    Så se på koden nedenfor og legg merke til følgende endringer og følgende årsaker til endringene. Jeg fremhevet alle nye linjer med farge.

    Navnet på skjemafeltene er endret. Du kan spørre – hvorfor i helvete trenger vi dette? Det er enkelt, jeg skal svare deg. Så vidt jeg vet, leter noen spambotter etter nettsteder som leter etter skjemaer og fyller dem ut basert på navnene på disse feltene. I teorien, hvis de ikke finner en match, så drar de hjem, og det er det vi ønsker. Selvfølgelig tror jeg ikke graden av denne beskyttelsen er spesielt stor, men det vil ikke skade oss, og hvis spam-e-postene reduseres med 1 bokstav, vil det være bra =).

    Sjekker om e-postadressen er skrevet inn riktig. Linje 17 bruker elseif-operatøren, som vil bli sjekket hvis det returneres et positivt svar til oss, det vil si at det står at e-postadressen manglet i det hele tatt, det vil si at den ikke ble oppgitt. Her bruker vi preg_match funksjonen, som lar oss sammenligne den angitte adressen med vanlig uttrykk. Kanskje jeg skal skrive kort om regulære uttrykk senere, men foreløpig er det verdt å vite at et regulært uttrykk lager en slags mal som strengen vår kontrolleres mot. Og hvis, i vårt tilfelle, den angitte adressen ikke samsvarer med uttrykket, vil det igjen vises en feil. For eksempel, her er et par flere regulære uttrykk:
    |^[-а-яе\s\.,;:\?!]+$|i– dette regulære uttrykket lar deg bruke bare det russiske alfabetet og noen tegn som mellomrom, punktum, komma osv.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– og dette uttrykket lar deg kontrollere riktig stavemåte til en adresse på Internett.

    Deretter bruker vi else-operatøren, hvor all vår kode for å sende et brev allerede er overført. Du kan opprette bekreftelsesregler selv i hvilken som helst mengde, bare legg til nye hvis, for eksempel for å sjekke en e-postadresse, og du vil bli fornøyd.




    Kontaktperson:



    Kontakt Epost:



    Beskjed:






    Dette er hvordan du kan validere PHP-skjemaene dine uten å ty til noe uvedkommende. Neste gang i et innlegg om temaet skjemaer, tror jeg, vil validering av skjemaer i jQuery bli vurdert. I mellomtiden venter jeg på dine kommentarer og ønsker. God natt og god morgen alle sammen =).

    Dette og de neste kapitlene viser hvordan du bruker PHP til å validere skjemadata.

    PHP-skjemavalidering

    Tenk SIKKERHET når du behandler PHP-skjemaer!

    Disse sidene vil vise hvordan du behandler PHP-skjemaer med sikkerhet i tankene. Riktig validering av skjemadata er viktig for å beskytte skjemaet ditt mot hackere og spammere!

    HTML-skjemaet vi skal jobbe med i disse kapitlene, inneholder ulike inndatafelt: obligatoriske og valgfrie tekstfelt, alternativknapper og en send-knapp:

    Valideringsreglene for skjemaet ovenfor er som følger:

    Feltvalideringsregler
    Navn Obligatorisk. + Må bare inneholde bokstaver og mellomrom
    E-post Obligatorisk. + Må inneholde en gyldig e-postadresse (med @ og .)
    Nettsted Valgfri. Hvis den finnes, må den inneholde en gyldig URL
    Kommentar Valgfri. Inndatafelt med flere linjer (tekstområde)
    Kjønn Obligatorisk. Må velge en

    Først skal vi se på den vanlige HTML-koden for skjemaet:

    Tekstfelt

    Navn-, e-post- og nettstedsfeltene er tekstinndataelementer, og kommentarfeltet er et tekstområde. HTML-koden ser slik ut:

    Navn:
    E-post:
    Nettsted:
    Kommentar:

    Radioknapper

    Kjønnsfeltene er radioknapper og HTML-koden ser slik ut:

    Kjønn:
    Hunn
    Mann
    Annen

    Formelementet

    HTML-koden til skjemaet ser slik ut: