Neukusna validacija php. Validacija i čišćenje podataka pomoću PHP-a. Registriranje vlastitog pravila validacije

Prilikom izrade web aplikacija važno je ozbiljno shvatiti sigurnost, posebno kada se morate pozabaviti dobivanjem podataka od korisnika.

Opće sigurnosno pravilo je da nikome ne vjerujete, tako da se ne možete osloniti na korisnike da uvijek unose ispravne vrijednosti u obrasce. Na primjer, umjesto da unese ispravnu adresu e-pošte u polje, korisnik može unijeti netačnu adresu ili čak neke zlonamjerne podatke.

Kada je u pitanju validacija korisničkih podataka, to se može obaviti ili na strani klijenta (u web pretraživaču) ili na strani servera.

Ranije se provjera valjanosti na strani klijenta mogla obaviti samo pomoću JavaScripta. Ali sve se promijenilo (ili se skoro promijenilo), budući da se uz pomoć HTML5 validacija može obaviti u pretraživaču, bez potrebe za pisanjem složenih validacijskih skripti u JavaScriptu.

Provjera valjanosti obrasca korištenjem HTML5

HTML5 pruža prilično robustan mehanizam zasnovan na sljedećim atributima oznake: tip, uzorak i zahtjev. Sa ovim novim atributima, možete prenijeti neke od funkcionalnosti provjere valjanosti podataka u pretraživač.

Pogledajmo ove atribute da bismo razumjeli kako oni mogu pomoći kod provjere valjanosti obrasca.

type atribut

Ovaj atribut govori koje polje unosa treba prikazati za obradu podataka, na primjer poznato polje poput

Neka polja za unos već pružaju standardne metode validacije, bez potrebe za pisanjem dodatnog koda. Na primjer, provjerava polje kako bi osigurao da unesena vrijednost odgovara predlošku važeće adrese e-pošte. Ako se u polje unese netačan znak, obrazac se ne može poslati dok se vrijednost ne ispravi.

Pokušajte se poigrati sa vrijednostima polja e-pošte u demonstraciji ispod.

Postoje i drugi standardni tipovi polja, poput , i za provjeru valjanosti brojeva, URL-ova i telefonskih brojeva.

Napomena: Formati telefonskih brojeva razlikuju se od zemlje do zemlje zbog razlika u broju cifara telefonskih brojeva i razlika u formatima. Kao rezultat toga, specifikacija ne definira algoritam za provjeru telefonskih brojeva, tako da je u vrijeme pisanja ova funkcija slabo podržana od strane pretraživača.

Na našu sreću, provjera valjanosti telefonskog broja može se obaviti pomoću atributa uzorka, koji uzima regularni izraz kao argument, što ćemo pogledati sljedeće.

atribut uzorka

Atribut uzorka će vjerovatno natjerati mnoge front-end programere da skaču od radosti. Ovaj atribut prihvata regularni izraz (sličan JavaScript formatu regularnog izraza) koji će se koristiti za provjeru ispravnosti podataka unesenih u polje.

Regularni izrazi su jezik koji se koristi za raščlanjivanje i manipulaciju tekstom. Često se koriste za složene operacije pronalaženja i zamjene, kao i za provjeru ispravnosti unesenih podataka.

Danas su regularni izrazi uključeni u najpopularnije programske jezike, kao i u mnoge skriptne jezike, uređivače, aplikacije, baze podataka i uslužne programe komandne linije.

Regularni izrazi (RegEX) su moćan, sažet i fleksibilan alat za usklađivanje niza teksta, kao što su pojedinačni znakovi, riječi ili obrasci znakova.

Prenošenjem regularnog izraza kao vrijednosti atributa uzorka, možete odrediti koje su vrijednosti prihvatljive za dato polje za unos, kao i obavijestiti korisnika o greškama.

Pogledajmo nekoliko primjera korištenja regularnih izraza za provjeru vrijednosti polja za unos.

Brojevi telefona

Kao što je ranije spomenuto, tip polja tel nije u potpunosti podržan od strane pretraživača zbog nedosljednosti u formatima telefonskih brojeva u različitim zemljama.

Na primjer, u nekim zemljama format telefonskih brojeva je xxxx-xxx-xxxx, a sam telefonski broj će biti otprilike ovako: 0803-555-8205.

Regularni izraz koji ovaj obrazac odgovara je: ^\d(4)-\d(3)-\d(4)$ . U kodu se ovo može napisati ovako:

Telefonski broj:

Alfanumeričke vrijednosti Potreban atribut

Ovo je Boolean atribut koji se koristi za označavanje da vrijednost datog polja mora biti popunjena da bi se obrazac poslao. Kada dodate ovaj atribut u polje, pretraživač će zahtijevati od korisnika da popuni ovo polje prije slanja obrasca.

Ovo nas štedi od implementacije validacije polja pomoću JavaScripta, što programerima može uštedjeti neko vrijeme.

Na primjer: ili (za XHTML kompatibilnost)

Sve demonstracije koje ste vidjeli iznad koriste traženi atribut, tako da ga možete isprobati pokušajem da pošaljete obrazac bez popunjavanja polja.

Zaključak

Podrška pretraživača za validaciju obrasca je prilično dobra, a za starije pretraživače možete koristiti polifile.

Vrijedi napomenuti da je oslanjanje samo na validaciju na strani pretraživača opasno, jer napadači ili botovi mogu lako zaobići ove provjere.

Ne podržavaju svi pretraživači HTML5 i neće svi podaci poslati vašoj skripti doći iz vašeg obrasca. To znači da je prije konačnog prihvatanja podataka od korisnika potrebno provjeriti njihovu ispravnost na strani servera.

Vrlo je bitno da se unos u vaš obrazac potvrdi prije nego što uzmete podatke za podnošenje obrasca za dalju obradu. Kada u obrascu ima mnogo polja, PHP skripta za validaciju postaje previše složena. Štaviše, budući da radite istu ili sličnu provjeru valjanosti za većinu obrazaca koje pravite, previše se duplog truda troši na validacije obrazaca.

O ovoj generičkoj skripti za validaciju PHP obrasca

Ova generička PHP skripta validatora obrasca olakšava dodavanje validacije u vaš obrazac.

Mi kreiramo i povezujemo skup "deskriptora validacije" sa svakim elementom u obrascu. “Deskriptor validacije” je niz koji specificira tip provjere valjanosti koji će se izvršiti. Na primjer, “req” znači potrebno, “alpha” znači dozvoliti samo abecedne znakove i tako dalje.

Svako polje u obrascu može imati nulu, jednu ili više validacija. Na primjer, unos ne smije biti prazan, trebao bi biti manji od 25 znakova, trebao bi biti alfanumerički itd.

Možete pridružiti skup deskriptora validacije za svako polje unosa u obrascu.

Preuzmite PHP skriptu za validaciju obrasca

U nastavku možete preuzeti PHP skriptu za validaciju obrasca:
Zip datoteka sadrži skriptu za validaciju forme formvalidator.php, dokumentaciju i primjere upotrebe.

Korištenje PHP skripte za provjeru valjanosti obrasca
  • Uključite formvalidator.php u svoju skriptu za obradu obrasca
  • require_once "formvalidator.php"
  • Kreirajte objekt FormValidator i dodajte deskriptore za provjeru valjanosti obrasca.
  • $validator = novi FormValidator(); $validator->addValidation("Ime","req","Popunite ime"); $validator->addValidation("E-pošta","e-pošta", "Unos za e-poštu treba da bude važeća vrednost e-pošte"); $validator->addValidation("E-pošta","req","Popunite e-poštu");

    Prvi argument je naziv polja za unos u obrascu. Drugi argument je deskriptor validacije koji govori o tipu potrebne validacije. Treći argument je poruka o grešci koja će se prikazati ako provjera valjanosti ne uspije.

  • Potvrdite obrazac pozivanjem funkcije ValidateForm().
  • if(!$validator->ValidateForm()) ( echo "Greške validacije:"; $error_hash = $validator->GetErrors(); foreach($error_hash kao $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) ) Primjer

    Primjer u nastavku će učiniti ideju jasnijom

    Ime: Email:

    Dodavanje prilagođene validacije

    Ako želite da dodate prilagođenu provjeru valjanosti, koju ne pružaju deskriptori validacije, možete to učiniti. Evo koraka:

  • Kreirajte klasu za prilagođenu provjeru valjanosti i nadjačajte funkciju DoValidate().
  • class MyValidator proširuje CustomValidator ( funkcija DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="Nema dozvoljenih URL-ova u komentarima"; vrati false; ) vrati true; ) )

  • Dodajte prilagođeni objekt provjere valjanosti
  • $validator = novi FormValidator(); $validator->addValidation("Ime","req","Popunite ime"); $validator->addValidation("E-pošta","e-pošta", "Unos za e-poštu treba da bude važeća vrednost e-pošte"); $validator->addValidation("E-pošta","req","Popunite e-poštu"); $custom_validator = novi MyValidator(); $validator->AddCustomValidator($custom_validator);

    Prilagođena funkcija provjere će biti pozvana automatski nakon ostalih provjera valjanosti.

    Tabela deskriptora validacije

    Evo liste svih deskriptora validacije:

    Deskriptor validacijeUpotreba
    reqPolje ne smije biti prazno
    maxlen=???maksimalno provjerava dužinu unesenih podataka. Na primjer, ako je maksimalna dozvoljena veličina 25, dajte deskriptor validacije kao “maxlen=25”
    minlen=???provjerava dužinu unesenog niza na traženi minimum. primjer “minlen=5”
    alnumProvjerite podatke da li sadrže bilo koje druge znakove osim abecednih ili numeričkih znakova
    alnum_sDozvoljava samo abecedne, numeričke i razmakne znakove
    brProvjerite numeričke podatke
    alfaProvjerite abecedne podatke.
    alpha_sProvjerite abecedne podatke i dopustite razmake.
    emailPolje je polje e-pošte i provjerite valjanost podataka.
    lt=???
    manje od=???
    Provjerite jesu li podaci manji od proslijeđene vrijednosti. Vrijedi samo za numerička polja.
    primjer: ako vrijednost treba biti manja od 1000 dajte opis validacije kao “lt=1000”
    gt=???
    veće od=???
    Provjerite jesu li podaci veći od proslijeđene vrijednosti. Vrijedi samo za numerička polja.
    primjer: ako vrijednost treba biti veća od 10 dajte opis validacije kao “gt=10”
    regexp=???Provjerite pomoću regularnog izraza da li vrijednost treba odgovarati regularnom izrazu.
    primjer: “regexp=^(1.20)$” dozvoljava do 20 abecednih znakova.
    dontselect=??Ovaj deskriptor provjere valjanosti je za odabrane ulazne stavke (liste) Normalno, okviri za odabir liste će imati jednu stavku koja kaže „Odaberi jednu“. Korisnik bi trebao odabrati drugu opciju osim ove opcije. Ako je vrijednost ove opcije 'Odaberi jedan', opis validacije bi trebao biti "dontselect=Odaberi jedan"
    dontselectchkOvaj deskriptor validacije je za potvrdne okvire. Korisnik ne bi trebao označiti dato polje za potvrdu. Navedite vrijednost polja za potvrdu umjesto ??
    Na primjer, dontselectchk=on
    shouldselchkOvaj deskriptor validacije je za potvrdne okvire. Korisnik treba da označi dato polje za potvrdu. Navedite vrijednost polja za potvrdu umjesto ??
    Na primjer, shouldselchk=on
    dontselectradioOvaj deskriptor validacije je za radio dugmad. Korisnik ne bi trebao odabrati dato radio dugme. Navedite vrijednost radio dugmeta umjesto ??
    Na primjer, dontselectradio=NE
    selectradioOvaj deskriptor validacije je za radio dugmad. Korisnik treba da odabere dato radio dugme. Navedite vrijednost radio dugmeta umjesto ??
    Na primjer, selectradio=yes
    selmin=??Odaberite najmanje n broj potvrdnih okvira iz grupe potvrdnih okvira.
    Na primjer: selmin=3
    seloneRadio grupu čini obaveznom. Korisnik treba da izabere najmanje jednu stavku iz radio grupe.
    eqelmnt=???usporedite dva elementa u obrascu i provjerite jesu li vrijednosti iste Na primjer, 'lozinka' i 'potvrdi lozinku'. Zamijenite ??? sa imenom drugog ulaznog elementa.
    Na primjer: eqelmnt=confirm_pwd

    Govorit ćemo o validaciji POST ili GET podataka, iako se to u principu može primijeniti i na podatke primljene drugim metodama, kao što su kolačići. Dok razvijate bilo koju web aplikaciju, potrebno je da napišete interfejs za interakciju sa korisnicima i prirodno kreirate različite forme za korisnike da šalju podatke na server. na primjer, to mogu biti komentari. Mislim da je svima jasno i očigledno da primljene podatke treba provjeriti da li odgovaraju vrsti, veličini i navedenom rasponu. Prije svega, to je potrebno zbog sigurnosti sistema, web stranice ili baze podataka, jer... Netačno preneseni podaci ili namjerno loše formiran zahtjev mogu otvoriti pristup napadaču.

    Drugo, neprovjereni podaci, ako su netačni, mogu uzrokovati nestabilan rad skripte, sistema ili cijelog servera. Dakle, sve podatke treba provjeriti i još jednom provjeriti, možda će neko reći da nema potrebe za pretjeranom paranojom, ali vjerujem da po ovom pitanju jednostavno ne može biti pretjerano.

    Nemojte vjerovati podacima primljenim od korisnika, ni pod kojim izgovorom, ni pod kojim okolnostima. Dešava se da smo jednostavno previše lijeni da napišemo kod koji još jednom provjerava primljene podatke ili se nadamo da su postojeće metode provjere dovoljne, zbog čega sebi činimo ustupke.

    Mala digresija sa teme:
    Rad na projektima, izrada i programiranje web stranica, skripti i drugih sistema oduzima mi skoro svo slobodno vrijeme (osim radnog vremena), drugim riječima, ovaj posao radim maksimalno mogući broj sati dnevno. S vremena na vrijeme postoji potreba da se nešto testira, iz zabave ili samo iz radoznalosti. Kao rezultat toga, sajtovi napravljeni na brzinu, koristeći domaće motore ili CMS drevnih verzija, postaju slični laboratorijskim pacovima za testiranje. Naravno, sve navedeno pati od krivo napisanog koda, nedostatka kontrole podataka i jednostavno vrvi od raznih grešaka. Zapravo, u većini slučajeva, u sat vremena svojih eksperimenata na takvim stranicama, uspijevam pronaći nekoliko ozbiljnih ranjivosti, a većina njih leži u nedovoljnoj validaciji primljenih podataka. Nedavno se ovo često nalazi u skriptama koje obrađuju POST podatke primljene od JavaScripta + Ajaxa.

    Očigledno, programeri koji su pisali ove skripte koristeći Ajax vjeruju da, budući da se svi zahtjevi dešavaju u pozadini, bez znanja korisnika ili jednostavno bez ponovnog učitavanja stranice, onda podatke ne treba posebno provjeravati.

    Po pravilu, dosta ovih skripti ispadne toliko rupa da bez mnogo truda uspiju napraviti veću rupu i poplaviti svoju školjku. naravno, isključivo u svrhu eksperimentisanja i ništa više (administracija ovakvih sajtova je uvek obaveštena o postojećim ranjivostima).

    Mislim da je važnost validacije svima jasna. Dugo sam svaki put pisao isti dio koda, a zatim koristio vlastite funkcije provjere podataka, od kojih su mnoge bile vrlo primitivne i, po pravilu, razbacane po različitim dijelovima (uključenih) datoteka. Ubrzo sam počeo da se upoznajem sa PHP okvirima Zend, CI, Kohana, od kojih je svaki implementirao svoju klasu za validaciju podataka koje sam pozajmio za svoje projekte. Na kraju sam odlučio da jedan od CI časova prilagodim svojim potrebama, ali se ispostavilo da se autor jednog od blogova o programiranju već pobrinuo za to. Zatim, dijelim njegove radove, odnosno modificiranu CodeIgniter biblioteku.

    Pogledajmo sljedeći kod:

    Pogledaj kod PHP

    require_once "validator.class.php" ; $validator = novi Validator() ; $validator -> set_rules ("name" , "Vaše ime" , niz ("required" => , "alpha" => ) ) ; $validator -> set_rules ("email" , "Vaš email" , niz ("required" => "Polje %s je obavezno" , "valid_email" => ) ) ; if ($validator -> run () ) ( echo "Validacija je bila uspješna" ; ) else ( echo $validator -> get_string_errors () ;)

    Kao što možete vidjeti iz primjera, u prvi red uključujemo datoteku klase validator.calss.php našem scenariju. Zatim kreiramo instancu klase i spremamo objekat u varijablu $validator.
    Zatim koristeći metodu $validator->set_rules($field, $label, $rules) postavite polja za validaciju.

    Ova metoda uzima 3 parametra:

  • $field- naziv polja za provjeru valjanosti (vrijednost atributa name u oznaci)
  • $label- naziv polja za validaciju, biće umetnut u poruke o grešci
  • $pravila- niz pravila validacije, u kojem se pravilo validacije koristi kao ključ, a poruka o grešci za ovo pravilo se koristi kao vrijednost
  • Nakon što su postavljena sva polja za validaciju, pokrećemo validator koristeći metodu $validator->run(). Ako je provjera valjanosti bila uspješna, ova metoda će vratiti vrijednost ISTINITO, inače, ako ima grešaka, vratit će se FALSE.

    Postoje tri načina za primanje poruka o grešci:

  • get_string_errors()- vraća sve poruke o grešci kao niz
  • get_array_errors()— vraća sve poruke kao niz, pri čemu se ime polja koristi kao ključ, a opis greške za ovo polje se koristi kao vrijednost.
  • form_error($field)- vraća poruku o grešci za polje koje je proslijeđeno kao parametar $field
  • Podrazumevano, poruke o greškama su umotane u oznaku . Da biste postavili svoj dizajn, koristite metodu set_error_delimiters($prefiks, $sufiks). Na primjer ovako:

    Poruke o greškama će se sada pojaviti kao div sa klasom "greška"

    Kao što vidite, sve je vrlo jednostavno.

    Pogledaj kod PHP

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

    Da biste postavili pravila validacije, možete koristiti metodu set_rules($fields) proslijediti višedimenzionalni asocijativni niz. Pogledajmo primjer:

    Pogledaj kod PHP

    $rules = niz ( array ( "field" => "name" , "label" => "Vaše ime" , "rules" => array ( "required" => "Polje %s je obavezno" , "alpha" = > "Polje %s mora sadržavati samo slova" ) , array ( "field" => "email" , "label" => "Vaša e-pošta" , "rules" => niz ( "obavezno" => "Polje % s je obavezno" , "valid_email" => "Polje %s mora sadržavati ispravnu adresu e-pošte" ) ) ) ; $validator -> set_rules ($rules) ;

    Kao što vidite, zapisao sam ista pravila validacije kao u prvom primjeru, samo u obliku višedimenzionalnog asocijativnog niza. Možete koristiti bilo koju od metoda koje vam najviše odgovaraju u datoj situaciji.

    Dakle, koja pravila validacije podržava ova klasa?

    Donio sam na ovaj čas najčešća pravila validacije s kojima se svi susreću. Evo kompletne liste ovih pravila:

    potrebnoVraća FALSE ako je polje prazno
    cijeli brojVraća FALSE ako vrijednost nije cijeli broj
    floatVraća FALSE ako vrijednost nije numerička vrijednost
    valid_urlVraća FALSE ako vrijednost nije važeći URL
    valid_emailVraća FALSE ako vrijednost nije važeća adresa e-pošte
    valid_ipVraća FALSE ako IP adresa nije važeća
    utakmiceVraća FALSE ako element ne odgovara vrijednosti drugog elementa polja
    alfaVraća FALSE ako element sadrži više od samo slova
    valid_captchaVraća FALSE ako vrijednost u polju sesije nije jednaka vrijednosti polja obrasca
    valid_dateVraća FALSE ako element sadrži nevažeći datum

    Većina ovih pravila koristi filtere, koji su postali dostupni u PHP 5.

    Ako želite, uvijek možete proširiti skup pravila za validaciju dodavanjem potrebnih funkcija klasi Validator.

    Da biste dobili obrađenu vrijednost POST podataka, koristite sljedeću metodu:

    Pogledaj kod PHP

    Tipično, ova metoda se poziva za brisanje obrasca nakon uspješne obrade obrasca.

    Dobro veče svima (više kao noć - prim. urednika). Danas ćemo to malo poboljšati. Prvo, hajde da naučimo kako da uradimo provjeru valjanosti obrazaca u PHP-u i izvršimo neke sigurnosne manipulacije.

    Dakle, pogledajte kod u nastavku i zabilježite sljedeće promjene i sljedeće razloge za promjene. Sve nove linije sam označio bojom.

    Naziv polja obrasca je promijenjen. Možda ćete se zapitati – zašto nam je dođavola ovo potrebno? Jednostavno je, odgovoriću vam. Koliko ja znam, neki spam botovi pretražuju stranice tražeći obrasce i ispunjavaju ih na osnovu naziva ovih polja. U teoriji, ako ne nađu par, onda idu kući, što je ono što želimo. Naravno, ne mislim da je stepen ove zaštite posebno veliki, ali nam to neće naškoditi, a ako se spam e-mailovi smanje za 1 slovo, to će biti dobro =).

    Provjera da li je email adresa ispravno unesena. Linija 17 koristi elseif operator, koji će se provjeriti ako nam se vrati pozitivan odgovor, odnosno da je e-mail adresa uopće nedostajala, odnosno nije upisana. Ovdje koristimo funkciju preg_match, koja nam omogućava da uporedimo unesenu adresu sa regularni izraz. Možda ću kasnije ukratko pisati o regularnim izrazima, ali za sada vrijedi znati da regularni izraz stvara neku vrstu šablona prema kojem se provjerava naš string. A ako u našem slučaju unesena adresa ne odgovara izrazu, onda će se opet prikazati greška. Na primjer, evo još nekoliko regularnih izraza:
    |^[-a-âe\s\.,;:\?!]+$|i– ovaj regularni izraz vam omogućava da koristite samo rusko pismo i neke znakove kao što su razmak, tačka, zarez itd.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– i ovaj izraz vam omogućava da provjerite ispravnost pisanja adrese na Internetu.

    Zatim koristimo operator else, gdje je sav naš kod za slanje pisma već prebačen. Možete sami kreirati pravila za verifikaciju u bilo kojoj količini, samo dodajte nova ako, kao što je za provjeru adrese e-pošte, i bit ćete sretni.




    Kontakt osoba:



    Kontaktni e-mail:



    Poruka:






    Ovo je način na koji možete potvrditi svoje PHP obrasce bez pribjegavanja bilo čemu stranom. Sljedeći put u postu na temu formi, mislim da će se razmatrati validacija formi u jQueryju. U međuvremenu, čekam vaše komentare i želje. Laku noć i dobro jutro svima =).

    Ovo i naredna poglavlja pokazuju kako koristiti PHP za validaciju podataka obrasca.

    PHP Validacija obrasca

    Razmislite o SIGURNOSTI kada obrađujete PHP obrasce!

    Ove stranice će pokazati kako obraditi PHP obrasce imajući na umu sigurnost. Pravilna provjera valjanosti podataka obrasca je važna za zaštitu vašeg obrasca od hakera i spamera!

    HTML obrazac na kojem ćemo raditi u ovim poglavljima, sadrži različita polja za unos: obavezna i opciona tekstualna polja, radio dugmad i dugme za slanje:

    Pravila validacije za gornji obrazac su sljedeća:

    Pravila validacije polja
    Ime Obavezno. + Mora sadržavati samo slova i razmak
    Email Obavezno. + Mora sadržavati važeću adresu e-pošte (sa @ i .)
    Website Opciono. Ako postoji, mora sadržavati važeći URL
    Komentar Opciono. Višelinijsko polje za unos (područje teksta)
    Rod Obavezno. Mora se odabrati jedan

    Prvo ćemo pogledati običan HTML kod za obrazac:

    Text Fields

    Polja imena, e-pošte i web stranice su elementi za unos teksta, a polje za komentar je tekstualno područje. HTML kod izgleda ovako:

    ime:
    Email:
    web stranica:
    komentar:

    Radio Buttons

    Polja za spol su radio dugmad i HTML kod izgleda ovako:

    spol:
    Žensko
    Muško
    Ostalo

    Element forme

    HTML kod obrasca izgleda ovako: