Neokusna validacija php. Validacija in čiščenje podatkov s pomočjo PHP. Registrirajte svoje lastno validacijsko pravilo
Pri izdelavi spletnih aplikacij je pomembno, da varnost jemljete resno, še posebej, ko se morate ukvarjati s pridobivanjem podatkov od uporabnikov.
Splošno varnostno pravilo je, da ne zaupate nikomur, zato se ne morete zanesti na uporabnike, da bodo v obrazce vedno vnesli pravilne vrednosti. Na primer, namesto pravilnega e-poštnega naslova v polje lahko uporabnik vnese napačen naslov ali celo zlonamerne podatke.
Ko gre za preverjanje uporabniških podatkov, se to lahko izvede na strani odjemalca (v spletnem brskalniku) ali na strani strežnika.
Prej je bilo preverjanje na strani odjemalca mogoče izvesti samo z uporabo JavaScripta. Toda vse se je spremenilo (ali skoraj spremenilo), saj je s pomočjo HTML5 mogoče preverjanje opraviti v brskalniku, ne da bi bilo treba pisati zapletene validacijske skripte v JavaScriptu.
Preverjanje obrazca z uporabo HTML5HTML5 zagotavlja dokaj robusten mehanizem, ki temelji na naslednjih atributih oznake: vrsta, vzorec in zahteva. S temi novimi atributi lahko nekatere funkcije preverjanja podatkov prenesete v brskalnik.
Oglejmo si te atribute, da bomo razumeli, kako lahko pomagajo pri preverjanju obrazca.
atribut vrsteTa atribut pove, katero vnosno polje prikazati za obdelavo podatkov, na primer znano polje, kot je
Nekatera vnosna polja že ponujajo standardne metode preverjanja brez potrebe po pisanju dodatne kode. Na primer, preveri polje, da zagotovi, da se vnesena vrednost ujema s predlogo veljavnega e-poštnega naslova. Če v polje vnesete napačen znak, obrazca ni mogoče oddati, dokler vrednost ni popravljena.
Poskusite se poigrati z vrednostmi e-poštnih polj v spodnji predstavitvi.
Obstajajo tudi druge standardne vrste polj, kot so , in za preverjanje številk, URL-jev in telefonskih številk.
Opomba: Formati telefonskih številk se od države do države razlikujejo zaradi razlik v številu števk v telefonskih številkah in razlik v formatih. Zaradi tega specifikacija ne določa algoritma za preverjanje telefonskih številk, zato brskalniki v času pisanja te funkcije slabo podpirajo.
Na našo srečo je mogoče preverjanje telefonske številke opraviti z atributom vzorca, ki kot argument vzame regularni izraz, ki si ga bomo ogledali v nadaljevanju.
atribut vzorcaAtribut vzorca bo verjetno poskrbel, da bodo številni razvijalci sprednjega dela poskočili od veselja. Ta atribut sprejme regularni izraz (podoben obliki regularnega izraza JavaScript), ki bo uporabljen za preverjanje pravilnosti podatkov, vnesenih v polje.
Regularni izrazi so jezik, ki se uporablja za razčlenjevanje in obdelavo besedila. Pogosto se uporabljajo za kompleksne operacije iskanja in zamenjave ter za preverjanje pravilnosti vnesenih podatkov.
Danes so regularni izrazi vključeni v večino priljubljenih programskih jezikov, pa tudi v številne skriptne jezike, urejevalnike, aplikacije, zbirke podatkov in pripomočke ukazne vrstice.
Regularni izrazi (RegEX) so zmogljivo, jedrnato in prilagodljivo orodje za ujemanje niza besedila, kot so posamezni znaki, besede ali vzorci znakov.
Če posredujete regularni izraz kot vrednost atributa vzorca, lahko določite, katere vrednosti so sprejemljive za dano vnosno polje, in uporabnika obvestite o napakah.
Oglejmo si nekaj primerov uporabe regularnih izrazov za preverjanje vrednosti vnosnih polj.
Telefonske številkeKot smo že omenili, brskalniki ne podpirajo v celoti polja tel zaradi nedoslednosti v formatih telefonskih številk v različnih državah.
V nekaterih državah je na primer oblika telefonskih številk xxxx-xxx-xxxx, sama telefonska številka pa bo približno takšna: 0803-555-8205.
Regularni izraz, s katerim se ta vzorec ujema, je: ^\d(4)-\d(3)-\d(4)$ . V kodi se to lahko zapiše takole:
Telefonska številka:
Alfanumerične vrednosti Potreben je atributTo je logični atribut, ki se uporablja za označevanje, da je treba za oddajo obrazca izpolniti vrednost danega polja. Ko dodate ta atribut v polje, bo brskalnik zahteval, da uporabnik izpolni to polje, preden odda obrazec.
To nam prihrani izvajanje preverjanja polja z uporabo JavaScripta, kar lahko razvijalcem prihrani nekaj časa.
Na primer: ali (za združljivost XHTML)
Vse predstavitve, ki ste jih videli zgoraj, uporabljajo obvezni atribut, zato ga lahko preizkusite tako, da poskusite oddati obrazec, ne da bi izpolnili katero koli polje.
ZaključekPodpora brskalnika za preverjanje obrazcev je precej dobra, pri starejših brskalnikih pa lahko uporabite polifile.
Treba je omeniti, da je zanašanje samo na preverjanje na strani brskalnika nevarno, saj lahko napadalci ali roboti ta preverjanja zlahka zaobidejo.
Vsi brskalniki ne podpirajo HTML5 in vsi podatki, poslani v vaš skript, ne bodo prišli iz vašega obrazca. To pomeni, da je treba pred dokončnim sprejemom podatkov od uporabnika preveriti njihovo pravilnost na strani strežnika.
Zelo pomembno je, da se vnos v vaš obrazec potrdi, preden oddate podatke iz obrazca v nadaljnjo obdelavo. Ko je v obrazcu veliko polj, postane skript za preverjanje veljavnosti PHP preveč zapleten. Poleg tega, ker izvajate enako ali podobno preverjanje veljavnosti za večino obrazcev, ki jih izdelate, je za preverjanje veljavnosti obrazcev vloženega preveč podvojenega truda.
Ta generični skript za preverjanje obrazcev PHP omogoča zelo enostavno dodajanje preverjanj obrazcu.
Z vsakim elementom v obrazcu ustvarimo in povežemo niz "validacijskih deskriptorjev". "Validacijski deskriptor" je niz, ki določa vrsto validacije, ki naj se izvede. Na primer, "req" pomeni obvezno, "alpha" pomeni dovoljenje samo črk in tako naprej.
Vsako polje v obrazcu ima lahko nič, eno ali več validacij. Na primer, vnos ne sme biti prazen, mora biti krajši od 25 znakov, mora biti alfanumerični itd.
Za vsako vnosno polje v obrazcu lahko povežete nabor potrditvenih deskriptorjev.
Prenesite skript za preverjanje obrazca PHPSpodaj lahko prenesete PHP skript za preverjanje obrazca:
Datoteka zip vsebuje skript za preverjanje obrazca formvalidator.php, dokumentacijo in vzorce uporabe.
Prvi argument je ime vnosnega polja v obrazcu. Drugi argument je validacijski deskriptor, ki pove vrsto zahtevane validacije. Tretji argument je sporočilo o napaki, ki se prikaže, če preverjanje ne uspe.
$inpname: $inp_err
\n"; ) ) PrimerS spodnjim primerom bo ideja bolj jasna
Ime: E-pošta:
Dodajanje preverjanja po meriČe želite dodati preverjanje po meri, ki ga deskriptorji preverjanja ne zagotavljajo, lahko to storite. Tukaj so koraki:
class MyValidator extends CustomValidator ( function DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="URL-ji niso dovoljeni v komentarjih"; vrni napačno; ) vrni resnično; ) )
$validator = nov FormValidator(); $validator->addValidation("Ime","req","Prosimo, vnesite ime"); $validator->addValidation("E-pošta","e-pošta", "Vnos za e-pošto mora biti veljavna vrednost e-pošte"); $validator->addValidation("E-pošta","req","Prosimo, izpolnite e-pošto"); $custom_validator = nov MyValidator(); $validator->AddCustomValidator($custom_validator);
Funkcija preverjanja po meri bo samodejno poklicana po drugih preverjanjih.
Tabela validacijskih deskriptorjevTukaj je seznam vseh validacijskih deskriptorjev:
Validacijski deskriptor | Uporaba |
zahtevano | Polje ne sme biti prazno |
maxlen=??? | preveri maksimalno dolžino vnesenih podatkov. Na primer, če je največja dovoljena velikost 25, navedite potrditveni deskriptor kot "maxlen=25" |
minlen=??? | preveri dolžino vnesenega niza na zahtevani minimum. primer "minlen=5" |
alnum | Preverite podatke, če vsebujejo druge znake razen črk ali številk |
alnum_s | Dovoljuje samo črke, številke in presledke |
št | Preverite številske podatke |
alfa | Preverite abecedne podatke. |
alfa_s | Preverite abecedne podatke in dovolite presledke. |
E-naslov | Polje je polje za e-pošto in preverite veljavnost podatkov. |
lt=??? manj=??? | Preverite, ali so podatki manjši od posredovane vrednosti. Velja samo za številska polja. primer: če mora biti vrednost manjša od 1000, podajte opis potrditve kot "lt=1000" |
gt=??? več kot=??? | Preverite, ali so podatki večji od posredovane vrednosti. Velja samo za številska polja. primer: če bi morala biti vrednost večja od 10, navedite potrditveni opis kot "gt=10" |
regexp=??? | Preverite z regularnim izrazom, ali se mora vrednost ujemati z regularnim izrazom. primer: “regexp=^(1.20)$” dovoljuje do 20 abecednih znakov. |
ne izberi=?? | Ta deskriptor za preverjanje veljavnosti je za izbrane vhodne elemente (sezname). Običajno imajo polja s seznami za izbiro en element z napisom »Izberi eno«. Uporabnik mora izbrati možnost, ki ni ta možnost. Če je vrednost te možnosti 'Izberi enega', mora biti opis preverjanja "dontselect=Izberi enega" |
dontselectchk | Ta potrditveni deskriptor je za potrditvena polja. Uporabnik ne sme označiti danega potrditvenega polja. Vnesite vrednost potrditvenega polja namesto ?? Na primer, dontselectchk=on |
shouldselchk | Ta potrditveni deskriptor je za potrditvena polja. Uporabnik mora izbrati dano potrditveno polje. Vnesite vrednost potrditvenega polja namesto ?? Na primer, shouldselchk=on |
dontselectradio | Ta potrditveni deskriptor je za izbirne gumbe. Uporabnik ne sme izbrati danega izbirnega gumba. Navedite vrednost izbirnega gumba namesto ?? Na primer, dontselectradio=NO |
selectradio | Ta potrditveni deskriptor je za izbirne gumbe. Uporabnik mora izbrati dani izbirni gumb. Navedite vrednost izbirnega gumba namesto ?? Na primer selectradio=yes |
selmin=?? | Izberite vsaj n število potrditvenih polj iz skupine potrditvenih polj. Na primer: selmin=3 |
samoten | Radijska skupina je obvezna. Uporabnik mora izbrati vsaj en element iz radijske skupine. |
eqelmnt=??? | primerjajte dva elementa v obrazcu in se prepričajte, da sta vrednosti enaki. Na primer, "geslo" in "potrditev gesla". Zamenjajte ??? z imenom drugega vhodnega elementa. Na primer: eqelmnt=confirm_pwd |
Govorili bomo o validaciji podatkov POST ali GET, čeprav se to načeloma lahko uporabi tudi za podatke, prejete z drugimi metodami, kot so piškotki. Ko razvijate katero koli spletno aplikacijo, morate napisati vmesnik za interakcijo z uporabniki in seveda ustvariti različne obrazce za pošiljanje podatkov uporabnikom na strežnik. na primer, to so lahko komentarji. Mislim, da je vsakomur jasno in očitno, da je treba prejete podatke preveriti, ali ustrezajo vrsti, velikosti in določenemu obsegu. V prvi vrsti je to potrebno zaradi varnosti sistema, spletne strani ali podatkovne baze, ker... Nepravilno posredovani podatki ali namerno slabo oblikovana zahteva lahko napadalcu odprejo dostop.
Drugič, nepreverjeni podatki, če so napačni, lahko povzročijo nestabilno delovanje skripta, sistema ali celotnega strežnika. Zato je treba vse podatke preveriti in še enkrat preveriti, morda bo kdo rekel, da pretirana paranoja ni potrebna, jaz pa menim, da v tej zadevi pač ne more biti pretirana.
Ne zaupajte podatkom, prejetim od uporabnikov, pod nobenim izgovorom in v nobenih okoliščinah. Zgodi se, da smo preprosto preleni, da bi napisali kodo, ki še enkrat preveri prejete podatke, ali pa upamo, da so obstoječe metode preverjanja dovolj, zaradi česar si popuščamo.
Majhen odmik od teme:
Delo na projektih, razvoj in programiranje spletnih strani, skript in drugih sistemov mi vzamejo skoraj ves prosti čas (poleg delovnega časa), oziroma to delo opravljam maksimalno možno število ur na dan. Od časa do časa je treba kaj preizkusiti, iz zabave ali samo radovednosti. Kot rezultat, mesta, izdelana na hitro, z uporabo domačih motorjev ali CMS starodavnih različic, postanejo podobne laboratorijske podgane za testiranje. Seveda vse našteto trpi zaradi pokvarjeno napisane kode, pomanjkanja nadzora nad podatki in preprosto mrgoli različnih hroščev. Pravzaprav mi v večini primerov v eni uri poskusov na takšnih spletnih mestih uspe najti več resnih ranljivosti, večina pa je v nezadostnem preverjanju prejetih podatkov. V zadnjem času se to pogosto pojavlja v skriptih, ki obdelujejo podatke POST, prejete iz JavaScript + Ajax.
Očitno programerji, ki so napisali te skripte z uporabo Ajaxa, verjamejo, da ker se vse zahteve pojavljajo v ozadju, brez vednosti uporabnika ali preprosto brez ponovnega nalaganja strani, podatkov ni treba posebej preverjati.
Praviloma se kar nekaj teh skript izkaže za tako luknjastih, da jim brez posebnega truda uspe narediti večjo luknjo in preplaviti svojo lupino. seveda izključno z namenom eksperimentiranja in nič več (administracija takih strani je vedno obveščena o obstoječih ranljivostih).
Mislim, da je pomen validacije jasen vsem. Dolgo časa sem pisal vsakič isto kodo, nato pa uporabljal lastne funkcije za preverjanje podatkov, od katerih so bile mnoge zelo primitivne in praviloma razpršene po različnih delih (vključenih) datotek. Kmalu sem se začel spoznavati s PHP ogrodji Zend, CI, Kohana, od katerih je vsak implementiral svoj razred za validacijo podatkov, ki sem si jih izposodil za svoje projekte. Na koncu sem se odločil, da enega od razredov CI prilagodim svojim potrebam, a se je izkazalo, da je za to poskrbel že avtor enega izmed programerskih blogov. Nato delim njegova dela, in sicer spremenjeno knjižnico CodeIgniter.
Poglejmo naslednjo kodo:
Ogled kode PHP
require_once "validator.class.php" ; $validator = new Validator() ; $validator -> set_rules ("name" , "Vaše ime" , array ("required" => , "alpha" => ) ) ; $validator -> set_rules ("email" , "Vaš e-poštni naslov" , array ("required" => "Polje %s je obvezno" , "valid_email" => ) ) ; if ($validator -> run () ) ( echo "Preverjanje je bilo uspešno" ; ) else ( echo $validator -> get_string_errors () ; ) |
Kot lahko vidite iz primera, v prvo vrstico vključimo datoteko razreda validator.calss.php našemu scenariju. Nato ustvarimo primerek razreda in shranimo objekt v spremenljivko $validator.
Nato uporabite metodo $validator->set_rules($field, $label, $rules) nastavite polja za preverjanje.
Ta metoda zajema 3 parametre:
Ko so nastavljena vsa polja za validacijo, zaženemo validator z metodo $validator->run(). Če je bilo preverjanje uspešno, bo ta metoda vrnila vrednost PRAV, sicer se vrne, če pride do napak LAŽNO.
Obstajajo trije načini prejemanja sporočil o napakah:
Sporočila o napakah so privzeto ovita v oznako . Če želite nastaviti svoj dizajn, uporabite metodo set_error_delimiters($predpona, $končnica). Na primer takole:
Sporočila o napakah bodo zdaj prikazana kot div z razredom "napaka"
Kot lahko vidite, je vse zelo preprosto.
Ogled kode PHP
$validator -> set_error_delimiters ( " ", " " ); |
Za nastavitev pravil preverjanja lahko uporabite metodo set_rules($fields) posredovati večdimenzionalni asociativni niz. Poglejmo primer:
Ogled kode PHP
$rules = array ( array ( "field" => "name" , "label" => "Vaše ime" , "rules" => array ( "required" => "Polje %s je obvezno" , "alpha" = > "Polje %s mora vsebovati samo črke" ) , array ( "field" => "email" , "label" => "Vaš email" , "rules" => array ( "required" => "Field % s is obvezno" , "valid_email" => "Polje %s mora vsebovati veljaven elektronski naslov" ) ) ) ; $validator -> set_rules ($rules ) ; |
Kot lahko vidite, sem zapisal enaka validacijska pravila kot v prvem primeru, le v obliki večdimenzionalnega asociativnega polja. Uporabite lahko katero koli metodo, ki vam v dani situaciji najbolj ustreza.
Torej, katera pravila preverjanja veljavnosti podpira ta razred?
V ta razred sem prinesel najpogostejša pravila potrjevanja, s katerimi se sreča vsak. Tu je popoln seznam teh pravil:
potrebno | Vrne FALSE, če je polje prazno |
celo število | Vrne FALSE, če vrednost ni celo število |
lebdi | Vrne FALSE, če vrednost ni številska vrednost |
valid_url | Vrne FALSE, če vrednost ni veljaven URL |
valid_email | Vrne FALSE, če vrednost ni veljaven e-poštni naslov |
veljaven_ip | Vrne FALSE, če naslov IP ni veljaven |
tekme | Vrne FALSE, če se element ne ujema z vrednostjo drugega elementa polja |
alfa | Vrne FALSE, če element vsebuje več kot le črke |
valid_captcha | Vrne FALSE, če vrednost v polju seje ni enaka vrednosti polja obrazca |
veljaven_datum | Vrne FALSE, če element vsebuje neveljaven datum |
Večina teh pravil uporablja filtre, ki so postali na voljo v PHP 5.
Če želite, lahko vedno razširite nabor pravil za preverjanje tako, da dodate potrebne funkcije v razred Validator.
Če želite pridobiti obdelano vrednost podatkov POST, uporabite naslednjo metodo:
Ogled kode PHP
Običajno se ta metoda pokliče za čiščenje obrazca po uspešni obdelavi obrazca.
Lep večer vsem (bolj noč – op. urednika). Danes ga bomo malo izboljšali. Najprej se naučimo, kako narediti validacijo obrazca v PHP in naredimo nekaj varnostnih manipulacij.
Torej, poglejte spodnjo kodo in upoštevajte naslednje spremembe in naslednje razloge za spremembe. Vse nove vrstice sem označil z barvo.
Ime polj obrazca je spremenjeno. Lahko se vprašate - zakaj za vraga potrebujemo to? Preprosto je, odgovoril vam bom. Kolikor vem, nekateri roboti za neželeno pošto iščejo obrazce in jih izpolnjujejo na podlagi imen teh polj. V teoriji, če ne najdejo tekmeca, gredo domov, kar si želimo. Seveda se mi ne zdi, da je stopnja te zaščite posebno velika, vendar nam ne bo škodilo, in če se vsiljena elektronska pošta zmanjša za 1 črko, bo to dobro =).
Preverjanje, ali je e-poštni naslov pravilno vnesen. Vrstica 17 uporablja operator elseif, ki bo preverjen, če nam bo vrnil pozitiven odgovor, to je, da je pisalo, da e-poštni naslov sploh manjka, to je, da ni bil vnesen. Tu uporabimo funkcijo preg_match, ki nam omogoča primerjavo vnesenega naslova z vsakdanje izražanje. Morda bom kasneje na kratko pisal o regularnih izrazih, a za zdaj je vredno vedeti, da regularni izraz ustvari nekakšno predlogo, po kateri se preverja naš niz. In če se v našem primeru vneseni naslov ne ujema z izrazom, se ponovno prikaže napaka. Na primer, tukaj je še nekaj regularnih izrazov:
|^[-а-яе\s\.,;:\?!]+$|i– ta regularni izraz omogoča uporabo samo ruske abecede in nekaterih znakov, kot so presledek, pika, vejica itd.
#http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– in ta izraz vam omogoča preverjanje pravilnega črkovanja naslova na internetu.
Nato uporabimo operator else, kjer je že prenesena vsa naša koda za pošiljanje pisma. Pravila za preverjanje lahko ustvarite sami v poljubni količini, samo dodajte nova, na primer za preverjanje e-poštnega naslova, in zadovoljni boste.
Kontaktna oseba:
Kontaktni e-poštni naslov:
Sporočilo:
Tako lahko potrdite svoje obrazce PHP, ne da bi uporabili karkoli tujega. Naslednjič v objavi na temo obrazcev mislim, da bo obravnavana validacija obrazcev v jQuery. Medtem pa čakam na vaše komentarje in želje. Lahko noč in lepo jutro vsem =).
To in naslednje poglavje prikazujeta, kako uporabljati PHP za preverjanje podatkov obrazca.
Preverjanje obrazca PHPPri obdelavi obrazcev PHP pomislite na VARNOST!
Te strani bodo pokazale, kako obdelovati obrazce PHP ob upoštevanju varnosti. Pravilno preverjanje podatkov obrazca je pomembno za zaščito vašega obrazca pred hekerji in pošiljatelji neželene pošte!
Obrazec HTML, ki ga bomo obravnavali v teh poglavjih, vsebuje različna vnosna polja: obvezna in neobvezna besedilna polja, izbirne gumbe in gumb za pošiljanje:
Pravila potrjevanja za zgornji obrazec so naslednja:
Ime | Obvezno. + Vsebovati mora samo črke in presledke |
E-naslov | Obvezno. + Vsebovati mora veljaven e-poštni naslov (z @ in .) |
Spletna stran | Neobvezno. Če je prisoten, mora vsebovati veljaven URL |
Komentiraj | Neobvezno. Večvrstično vnosno polje (textarea) |
Spol | Obvezno. Izbrati je treba enega |
Najprej si bomo ogledali navadno kodo HTML za obrazec:
Besedilna poljaPolja za ime, e-pošto in spletno mesto so elementi za vnos besedila, polje za komentar pa je besedilno polje. Koda HTML izgleda takole:
ime:
E-naslov:
Spletna stran:
komentar:
Polja za spol so izbirni gumbi in koda HTML je videti takole:
spol:
ženska
moški
drugo
HTML koda obrazca izgleda takole: