© 2013 All rights reserved.
3

Jednoduchá kontrola proměnných

Formuláře jsou prakticky nejjednodušším způsobem jak lze získat data od uživatele. S touto jednoduchostí jde ruku v ruce nebezpečí těchto dat. Uživatelům nemůžeme nikdy věřit a proto je nutné všechny tyto vstupy zabezpečit a data ověřovat. Nestačí například napsat, že v daném formulářovém inputu musí být zadán platný email, protože se vždy najde někdo, kdo se pokusí zadat libovolný řetězec, a nejen to. Špatně ošetřený vstup může vést k chybám jako SQL injection nebo XSS. Takový formulář je součástí téměř každého webu a pokud vás už přestalo bavit u každého takového formuláře neustále dokola provádět kontroly, můžete si vytvořit několik jednoduchých funkcí, které se o kontrolu budou starat. Ovšem nemusí se jednat pouze o formuláře, ale také bezpochyby o kontrolu proměnných ve skriptu. V tomto příkladu si vytvoříme třídu, v níž bude mít každá metoda na starosti kontrolu jiné hodnoty.

Kontrola délky řetězce
int check_length( mixed $var, int $min, int $max );

Začneme něčím jednodušším, a to metodou pro kontrolu délky řetězce. Vstupní hodnoty budou tří: kontrolovaný řetězec, minimální délka a nakonec maximální délka. Minimální délku bychom mohli dát jako nepovinný parametr, který by měl výchozí hodnotu 0, ale to už nechám na vás.

V metodě se nebudeme omezovat pouze pro kontrolu délky řetězce, ale bude umožňovat i kontrolu velikosti pole. Tím zabijeme dvě mouchy jednou ranou:

Metoda vrací jedničku nebo nulu podle výsledku kontroly.

Kontrola data
int check_date( string $date [, string $splitting ]);

Další metoda na kterou se podíváme a která bude určitě taky často využívána je kontrola datumu. Datum je většinou zadáváno ve tvaru ROK-MĚSÍC-DEN. Tento vstup bude předpokládat i naše metoda a takto zadané datum bude jedním ze vstupních parametrů. Druhý parametru bude oddělovací znak, který je v datumu použit.

Metoda nejprve, pomocí funkce explode, rozdělí datum na jeho jednotlivé částí a potom kontroluje, zda se jedná o platné datum:

Kontrola hesla
int check_password( strin $password_1, string $password_2 [, int $min, int $max ] );

Pokud máme hotovou metodu pro kontrolu délky řetězce, můžeme vytvořit další metodu, a to pro kontrolu hesla. Hesla jsou kontrolována dost často a všechno co většinou potřebujeme je kontrolovat maximální a minimální počet znaků, které uživatel zadal.

Metoda bude tedy velmi jednoduchá. Pro kontrolu délky využijeme metodu, která kontroluje délku řetězce, zde stačí kontrolovat pouze jedno zadání hesla, neboť potom provedeme kontrolu na shodnost, a tím pádem ošetříme případ, kdy by nebylo další zadání hesla v povoleném rozsahu:

Kontrola IP adresy
int check_ip_address( string $address );

Občas, i když asi ne často, budeme potřebovat provést kontrolu IP adresy. Adresu budeme požadovat ve tvaru: 127.0.0.1 a všechny ostatní případy budou vyhodnoceny jako FALSE.

Dále budeme požadovat aby všechny 4 čísla IP adresy byly v rozmezí 0-255 a poslední podmínka bude, aby čísla které jsou zadány byli 4. Na začátku metody ošetříme ještě případ, kdy uživatel zadal na konci IP adresy znak „.“:

Kontrola URL adresy
int check_url( string $url [, int $check_domain ] );

Co dost často provádíme je kontrola URL adresy. U URL adresy je většinou nejpodstatnější kontrolovat protokol, který byl zadán, protože uživatelé často do takového pole zadají jenom nesmyslnou spleť znaků. V poli si tedy nadefinujeme, které všechny protokoly budou povolené (v tomto případě pouze http, https a ftp, ale seznam si můžete rozšířit podle sebe ). Jako jeden ze vstupních parametrů bude tedy zadaná URL adresa. Metoda nám umožní navíc i kontrolu pravosti zadané URL adresy. Tento příklad ovšem většinou nebude fungovat pod systémem windows, proto je zde tato kontrola určena druhým, nepovinným parametrem:

Kontrola telefonního čísla
int check_phone( string $pnumber, [, int $length ] );

Kontrolu telefonního čísla musíme většinou provádět na základě nějaké vstupní masky (formátu v jakém je telefonní číslo přijatelné ). V našem případě bude telefon požadován ve tvaru: +xxx xxx xxx xxx. První parametr bude potom telefonní číslo. Pro jistotu si vytvoříme i druhý, nepovinný parametr, který určí maximální délku telefonního čísla.

Navíc bychom mohli ještě překontrolovat zda je celé telefonní číslo zadáno jako číselná hodnota.

Kontrola PSČ
int check_zipcode( string $zip_code [, int $max_length ] );

Kontrola PSČ může být taky často užitečná. Psč bude moci být v našem případě zadána pouze jako číselná hodnota doplněna maximálně mezerou. Vstupní parametry jsou tedy hodnota PSC a nepovinný parametr je délka PSC bez zadaných mezer. Mezery před kontrolou délky ořežeme:

Kontrola emailu
int check_email( string $email [, int $check_domain ] );

Velmi důležitá metoda je kontrola emailu. Metoda nám umožňuje, stejně jako metoda pro kontrolu URL adresy, kontrolovat navíc doménu, ovšem tato funkce zase zřejmě nebude fungovat pod systémem Windows a proto je tato funkce opět omezena nepovinným parametrem.

Kontrola rodného čísla
check_personal_identification_number( string $pin );

Poslední metodu pro kontrolu, kterou si vytvoříme a která může být užitečná je kontrola rodného čísla. Maska rodného čísla je už trochu složitější. Musíme zde kontrolovat všechna zadaná čísla, která se liší u muže a ženy.

Metoda má jediný vstupní parametr, kterým je právě rodné číslo, které je přesně určené:

Tím máme hotovy všechny základní funkce, potřebné pro kontrolu dat.

Strip slashes

Navíc si uvedeme ještě jednu metodu, která se bude starat o ořezání magic quotes, a to podle nastavené direktivy Magic Quotes GPC v php.ini.

Metoda uvede vždy všechny vstupní pole na stejné hodnoty a to s ořezanými Magic Quotes:

Jako vstupní parametr je pole předané jako reference. Změna se tedy provádí přímo na tomto poli.

Na závěr se zase podívejme co jsme vytvořili:

Comments are closed for this page

No, proc vetsina z toho jde prepsat na jednoradkove regularni vyrazy ?

A od kdy nemuze mit IP adresa na druhe a treti pozici 0 ? Ipadresa 123.0.0.1 je naprosto platna. Dokonce se na ni da pingnout. Kde udelali navrhari chybu ?

Kontrola telefonniho cisla je upne zavadejici, ze by to autor nekde opsal a moc nad tim nekoumal ? A vida, regularni vyraz pri kontrole emailu. A mam krasny email na domene .info – jaka skoda, ze neni platny …
No, jsme strasne radi za takto prinosnou tridu pro kontrolu vstupu a urcite ji pouzijeme na svem dalsim projektu…

Dobry den,
za IP adresu se omlouvam, chybka byla jenom v textu. Pokud by jste se podival do kodu, tak 0 projde bez problemu.
Ujistuji vas ze kontrolu telefonu jsem nikde neopsal 🙂

Jinak pokud jde o email, tak mate samozrejme pravdu, ale nic vam nebrani si kod upravit jak budete chtit, pro moje ucely mi to vyhoduje presne tak jak to je.

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836