Bez chuti ověření php. Validace a čištění dat pomocí PHP. Registrace vlastního ověřovacího pravidla

Při vytváření webových aplikací je důležité brát bezpečnost vážně, zvláště když se musíte potýkat se získáváním dat od uživatelů.

Obecným bezpečnostním pravidlem je nedůvěřovat nikomu, takže se nemůžete spoléhat na to, že uživatelé budou do formulářů vždy zadávat správné hodnoty. Například místo správné e-mailové adresy do pole může uživatel zadat nesprávnou adresu nebo dokonce nějaká škodlivá data.

Pokud jde o ověřování uživatelských dat, lze to provést buď na straně klienta (ve webovém prohlížeči) nebo na straně serveru.

Dříve bylo možné ověření na straně klienta provádět pouze pomocí JavaScriptu. Vše se ale změnilo (nebo téměř změnilo), protože pomocí HTML5 lze validaci provádět v prohlížeči, aniž by bylo nutné psát složité ověřovací skripty v JavaScriptu.

Ověření formuláře pomocí HTML5

HTML5 poskytuje poměrně robustní mechanismus založený na následujících atributech značek: typ, vzor a vyžadovat. S těmito novými atributy můžete přesunout některé funkce ověřování dat do prohlížeče.

Podívejme se na tyto atributy, abychom pochopili, jak mohou pomoci s ověřováním formuláře.

atribut typu

Tento atribut říká, které vstupní pole se má zobrazit pro zpracování dat, například známé pole

Některá vstupní pole již poskytují standardní metody ověření, aniž by bylo nutné psát další kód. Například zkontroluje pole, aby se ujistil, že zadaná hodnota odpovídá šabloně platné e-mailové adresy. Pokud je do pole zadán nesprávný znak, nelze formulář odeslat, dokud nebude hodnota opravena.

Zkuste si pohrát s hodnotami pole e-mailu v ukázce níže.

Existují také další standardní typy polí, jako je , a pro ověřování čísel, adres URL a telefonních čísel.

Poznámka: Formáty telefonních čísel se v jednotlivých zemích liší kvůli rozdílům v počtu číslic v telefonních číslech a rozdílům ve formátech. V důsledku toho specifikace nedefinuje algoritmus pro kontrolu telefonních čísel, takže v době psaní tohoto článku je tato funkce v prohlížečích špatně podporována.

Naštěstí pro nás lze ověření telefonního čísla provést pomocí atributu pattern, který bere regulární výraz jako argument, na který se podíváme dále.

atribut vzoru

Atribut vzor pravděpodobně způsobí, že mnoho vývojářů front-endu poskočí radostí. Tento atribut přijímá regulární výraz (podobný formátu JavaScriptu), který bude použit ke kontrole správnosti údajů zadaných do pole.

Regulární výrazy jsou jazyk používaný k analýze a manipulaci s textem. Často se používají pro složité operace vyhledávání a nahrazování a také pro kontrolu správnosti zadaných údajů.

Dnes jsou regulární výrazy obsaženy ve většině oblíbených programovacích jazyků a také v mnoha skriptovacích jazycích, editorech, aplikacích, databázích a nástrojích příkazového řádku.

Regulární výrazy (RegEX) jsou výkonným, stručným a flexibilním nástrojem pro porovnávání řetězce textu, jako jsou jednotlivé znaky, slova nebo vzory znaků.

Předáním regulárního výrazu jako hodnoty atributu pattern můžete určit, jaké hodnoty jsou přijatelné pro dané vstupní pole, a také informovat uživatele o chybách.

Podívejme se na několik příkladů použití regulárních výrazů k ověření hodnoty vstupních polí.

Telefonní čísla

Jak již bylo zmíněno dříve, typ pole tel není plně podporován prohlížeči z důvodu nekonzistencí ve formátech telefonních čísel v různých zemích.

Například v některých zemích je formát telefonních čísel xxxx-xxx-xxxx a samotné telefonní číslo bude vypadat takto: 0803-555-8205.

Regulární výraz, kterému tento vzor odpovídá, je: ^\d(4)-\d(3)-\d(4)$ . V kódu to lze zapsat takto:

Telefonní číslo:

Alfanumerické hodnoty Atribut je povinný

Toto je booleovský atribut používaný k označení, že hodnota daného pole musí být vyplněna, aby bylo možné formulář odeslat. Když přidáte tento atribut do pole, prohlížeč bude vyžadovat, aby uživatel toto pole před odesláním formuláře vyplnil.

To nám ušetří implementaci ověřování pole pomocí JavaScriptu, což může vývojářům ušetřit čas.

Například: nebo (pro kompatibilitu s XHTML)

Všechny ukázky, které jste viděli výše, používají požadovaný atribut, takže si to můžete vyzkoušet tak, že se pokusíte odeslat formulář bez vyplňování jakýchkoli polí.

Závěr

Podpora prohlížeče pro ověřování formulářů je docela dobrá a pro starší prohlížeče můžete použít polyfilly.

Stojí za zmínku, že spoléhat se pouze na ověření na straně prohlížeče je nebezpečné, protože tyto kontroly mohou útočníci nebo roboti snadno obejít.

Ne všechny prohlížeče podporují HTML5 a ne všechna data odeslaná do vašeho skriptu pocházejí z vašeho formuláře. To znamená, že před konečným přijetím dat od uživatele je nutné zkontrolovat jejich správnost na straně serveru.

Je velmi důležité nechat si ověřit vstup do formuláře před tím, než odešlete data z formuláře k dalšímu zpracování. Pokud je ve formuláři mnoho polí, stane se ověřovací skript PHP příliš složitým. Navíc, protože provádíte stejné nebo podobné ověřování pro většinu formulářů, které vytváříte, je vynaloženo příliš mnoho duplicitního úsilí na ověřování formulářů.

O tomto obecném skriptu pro ověření formuláře PHP

Tento obecný skript pro validaci formulářů PHP velmi usnadňuje přidávání ověření do formuláře.

Ke každému prvku ve formuláři vytváříme a přidružujeme sadu „ověřovacích deskriptorů“. „Deskriptor ověření“ je řetězec určující typ ověření, které má být provedeno. Například „req“ znamená povinné, „alfa“ znamená povolit pouze abecední znaky a tak dále.

Každé pole ve formuláři může mít nula, jedno nebo více ověření. Vstup by například neměl být prázdný, měl by mít méně než 25 znaků, měl by být alfanumerický atd.

Ke každému vstupnímu poli ve formuláři můžete přiřadit sadu ověřovacích deskriptorů.

Stáhněte si skript pro ověření formuláře PHP

Níže si můžete stáhnout skript pro ověření formuláře PHP:
Soubor zip obsahuje skript pro ověření formuláře formvalidator.php, dokumentaci a ukázky použití.

Použití skriptu pro ověření formuláře PHP
  • Zahrňte formvalidator.php do skriptu pro zpracování formuláře
  • require_once "formvalidator.php"
  • Vytvořte objekt FormValidator a přidejte deskriptory ověření formuláře.
  • $validator = new FormValidator(); $validator->addValidation("Name","req","Vyplňte prosím jméno"); $validator->addValidation("E-mail","email", "Vstup pro e-mail by měl být platný e-mail"); $validator->addValidation("E-mail","req","Vyplňte prosím e-mail");

    První argument je název vstupního pole ve formuláři. Druhým argumentem je deskriptor validace, který říká typ požadované validace. Třetím argumentem je chybová zpráva, která se zobrazí, pokud se ověření nezdaří.

  • Ověřte formulář voláním funkce ValidateForm().
  • if(!$validator->ValidateForm()) ( echo "Chyby ověření:"; $error_hash = $validator->GetErrors(); foreach($error_hash jako $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) ) Příklad

    Níže uvedený příklad objasní myšlenku

    Jméno: Email:

    Přidání vlastního ověření

    Pokud chcete přidat vlastní ověření, které není poskytováno deskriptory ověření, můžete tak učinit. Zde jsou kroky:

  • Vytvořte třídu pro vlastní ověření a přepište funkci DoValidate().
  • class MyValidator rozšiřuje CustomValidator ( funkce DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="Žádné adresy URL nejsou povoleny v komentářích"; return false; ) return true; ) )

  • Přidejte objekt vlastního ověření
  • $validator = new FormValidator(); $validator->addValidation("Name","req","Vyplňte prosím jméno"); $validator->addValidation("E-mail","email", "Vstup pro e-mail by měl být platný e-mail"); $validator->addValidation("E-mail","req","Vyplňte prosím e-mail"); $custom_validator = new MyValidator(); $validator->AddCustomValidator($custom_validator);

    Funkce uživatelského ověření bude volána automaticky po jiných ověřeních.

    Tabulka validačních deskriptorů

    Zde je seznam všech validačních deskriptorů:

    Deskriptor ověřeníPoužívání
    reqPole by nemělo být prázdné
    maxlen=???zkontroluje délku zadávaných údajů na maximum. Pokud je například maximální povolená velikost 25, uveďte deskriptor ověření jako „maxlen=25“.
    minlen=???zkontroluje délku zadaného řetězce na požadované minimum. příklad „minlen=5“
    alnumZkontrolujte, zda data neobsahují jiné znaky než abecední nebo číselné znaky
    alnum_sPovoluje pouze abecední, číselné a mezerové znaky
    čZkontrolujte číselná data
    alfaZkontrolujte abecední údaje.
    alfa_sZkontrolujte abecední údaje a povolte mezery.
    e-mailemPole je pole e-mailu a ověřuje platnost údajů.
    lt=???
    méně než =???
    Ověřte, že data jsou nižší než předaná hodnota. Platí pouze pro číselná pole.
    příklad: pokud by hodnota měla být menší než 1000, uveďte popis ověření jako „lt=1000“
    gt=???
    větší než =???
    Ověřte, že data jsou větší než předaná hodnota. Platí pouze pro číselná pole.
    příklad: pokud by hodnota měla být větší než 10, uveďte popis ověření jako „gt=10“
    regexp=???Pomocí regulárního výrazu zkontrolujte, zda by hodnota měla odpovídat regulárnímu výrazu.
    příklad: „regexp=^(1.20)$“ povoluje až 20 abecedních znaků.
    nevybírejte=??Tento deskriptor ověření je pro výběr vstupních položek (seznamů) Normálně budou mít výběrová seznamová pole jednu položku s nápisem ‚Vyberte jednu‘. Uživatel by měl vybrat jinou možnost než tuto. Pokud je hodnota této možnosti ‚Vybrat jednu‘, popis ověření by měl být „dontselect=Vyberte jednu“
    dontselectchkTento deskriptor ověření je pro zaškrtávací políčka. Uživatel by neměl zaškrtnout dané políčko. Zadejte hodnotu zaškrtávacího políčka namísto ??
    Například dontselectchk=on
    shouldselchkTento deskriptor ověření je pro zaškrtávací políčka. Uživatel by měl zaškrtnout dané zaškrtávací políčko. Zadejte hodnotu zaškrtávacího políčka namísto ??
    Například shouldselchk=on
    nevybírejte rádioTento deskriptor ověření je pro přepínací tlačítka. Uživatel by neměl vybrat daný přepínač. Zadejte hodnotu přepínače namísto ??
    Například dontselectradio=NO
    výběrové rádioTento deskriptor ověření je pro přepínací tlačítka. Uživatel by měl vybrat daný přepínač. Zadejte hodnotu přepínače namísto ??
    Například selectradio=yes
    selmin=??Vyberte alespoň n počet zaškrtávacích políček ze skupiny zaškrtávacích políček.
    Například: selmin=3
    osamocenýNastaví rádiovou skupinu jako povinnou. Uživatel by měl vybrat alespoň jednu položku ze skupiny rádia.
    eqelmnt=???porovnejte dva prvky ve formuláři a ujistěte se, že hodnoty jsou stejné, například „heslo“ a „potvrzení hesla“. Nahradit ??? se jménem druhého vstupního prvku.
    Například: eqelmnt=confirm_pwd

    Budeme mluvit o validaci dat POST nebo GET, i když v zásadě to lze aplikovat i na data přijatá jinými metodami, jako jsou soubory cookie. Když vyvíjíte jakoukoli webovou aplikaci, musíte napsat rozhraní pro interakci s uživateli a přirozeně vytvářet různé formuláře pro uživatele k odesílání dat na server. mohou to být například komentáře. Myslím, že je každému jasné a zřejmé, že přijatá data je třeba zkontrolovat, zda odpovídají typu, velikosti a specifikovanému rozsahu. V první řadě je to nutné pro zabezpečení systému, webu nebo databáze, protože... Nesprávně přenesená data nebo záměrně špatně vytvořený požadavek mohou otevřít přístup k útočníkovi.

    Za druhé, neověřená data, pokud jsou nesprávná, mohou způsobit nestabilní provoz skriptu, systému nebo celého serveru. Všechna data je tedy potřeba kontrolovat a překontrolovat, možná si někdo řekne, že přehnaná paranoia není potřeba, ale já věřím, že v této věci to přehnané být prostě nemůže.

    Pod žádnou záminkou a za žádných okolností nedůvěřujte údajům přijatým od uživatelů. Stává se, že jsme prostě příliš líní napsat kód, který kontroluje přijatá data ještě jednou, nebo doufáme, že stávající metody ověřování stačí, v důsledku čehož děláme ústupky sami sobě.

    Malá odbočka od tématu:
    Práce na projektech, vývoj a programování webů, skriptů a dalších systémů mi zabírá téměř veškerý volný čas (kromě pracovní doby), jinými slovy, tuto práci dělám na maximální možný počet hodin denně. Čas od času je potřeba něco otestovat, pro zábavu nebo jen pro zajímavost. Výsledkem je, že stránky vytvořené ve spěchu, používající podomácku vyrobené motory nebo CMS starých verzí, se stávají podobnými testovacími laboratorními krysami. Vše výše uvedené samozřejmě trpí křivě napsaným kódem, nedostatkem kontroly dat a prostě se to jen hemží různými chybami. Vlastně se mi ve většině případů za hodinu mých experimentů na takových stránkách podaří najít několik vážných zranitelností a většina z nich spočívá v nedostatečné validaci přijatých dat. V poslední době se to často vyskytuje ve skriptech, které zpracovávají data POST přijatá z JavaScript + Ajax.

    Programátoři, kteří napsali tyto skripty pomocí Ajaxu, se zjevně domnívají, že jelikož všechny požadavky probíhají na pozadí, bez vědomí uživatele nebo jednoduše bez opětovného načtení stránky, není třeba data nijak zvlášť kontrolovat.

    Zpravidla se nemálo těchto skriptů ukáže být tak plných děr, že bez větší námahy zvládnou udělat větší díru a zatopit si ulitu. samozřejmě pouze za účelem experimentování a nic víc (správa takových stránek je vždy informována o existujících zranitelnostech).

    Myslím, že důležitost validace je každému jasná. Dlouhou dobu jsem psal pokaždé stejný kus kódu, pak jsem používal vlastní funkce pro ověřování dat, z nichž mnohé byly velmi primitivní a zpravidla rozptýlené v různých částech (zahrnutých) souborů. Brzy jsem se začal seznamovat s PHP frameworky Zend, CI, Kohana, z nichž každý implementoval svou vlastní třídu pro validaci dat, která jsem si vypůjčil pro své projekty. Nakonec jsem se rozhodl jednu z CI tříd upravit na míru svým potřebám, ale ukázalo se, že autor jednoho z programátorských blogů si to už vzal na starost. Dále sdílím jeho díla, konkrétně upravenou knihovnu CodeIgniter.

    Podívejme se na následující kód:

    Zobrazit kód PHP

    require_once "validator.class.php" ; $validator = new Validator() ; $validator -> set_rules ("jméno" , "Vaše jméno" , pole ("požadováno" => , "alfa" => ) ) ; $validator -> set_rules ("email" , "Váš email" , pole ("vyžadováno" => "Pole %s je povinné" , "valid_email" => ) ) ; if ($validator -> spustit () ) ( echo "Ověření bylo úspěšné" ; ) else ( echo $validator -> get_string_errors () ;)

    Jak můžete vidět z příkladu, v prvním řádku zahrneme soubor třídy validator.calss.php do našeho scénáře. Dále vytvoříme instanci třídy a uložíme objekt do proměnné $validator.
    Poté pomocí metody $validator->set_rules($field, $label, $rules) nastavte pole pro ověření.

    Tato metoda má 3 parametry:

  • $pole- název ověřovacího pole (hodnota atributu name ve značce)
  • $label- název ověřovacího pole, bude vložen do chybových zpráv
  • $pravidla- pole ověřovacích pravidel, ve kterých je ověřovací pravidlo použito jako klíč a chybová zpráva pro toto pravidlo je použita jako hodnota
  • Po nastavení všech polí pro validaci spustíme validátor pomocí metody $validator->run(). Pokud bylo ověření úspěšné, tato metoda vrátí hodnotu SKUTEČNÝ, jinak, pokud se vyskytnou nějaké chyby, vrátí se NEPRAVDIVÉ.

    Chybové zprávy lze přijímat třemi způsoby:

  • get_string_errors()- vrátí všechny chybové zprávy jako řetězec
  • get_array_errors()— vrátí všechny zprávy jako pole, kde je jako klíč použit název pole a jako hodnota je použit popis chyby pro toto pole.
  • form_error($field)- vrátí chybovou zprávu pro pole předané jako parametr $field
  • Ve výchozím nastavení jsou chybové zprávy zabaleny do značky . Chcete-li nastavit svůj design, použijte metodu set_error_delimiters($prefix, $suffix). Například takto:

    Chybové zprávy se nyní zobrazí jako div s třídou "chyba"

    Jak vidíte, vše je velmi jednoduché.

    Zobrazit kód PHP

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

    Chcete-li nastavit pravidla ověření, můžete použít metodu set_rules($fields) předat vícerozměrné asociativní pole. Podívejme se na příklad:

    Zobrazit kód PHP

    $rules = pole ( pole ( "pole" => "jméno" , "label" => "Vaše jméno" , "pravidla" => pole ( "požadováno" => "Pole %s je povinné" , "alpha" = > "Pole %s musí obsahovat pouze písmena" ), pole ( "pole" => "e-mail" , "štítek" => "Váš email" , "pravidla" => pole ( "požadováno" => "Pole % s je povinné" , "valid_email" => "Pole %s musí obsahovat platnou e-mailovou adresu" ) ) ); $validator -> set_rules ($rules ) ;

    Jak vidíte, zapsal jsem stejná pravidla ověřování jako v prvním příkladu, pouze ve formě vícerozměrného asociativního pole. Můžete použít kteroukoli z metod, která vám v dané situaci nejlépe vyhovuje.

    Jaká pravidla ověřování tedy tato třída podporuje?

    Přinesl jsem do této třídy nejběžnější pravidla ověřování, se kterými se každý setkává. Zde je úplný seznam těchto pravidel:

    PožadovanéPokud je pole prázdné, vrátí hodnotu FALSE
    celé čísloVrátí FALSE, pokud hodnota není celé číslo
    plovákVrátí FALSE, pokud hodnota není číselná hodnota
    platná_urlPokud hodnota není platná adresa URL, vrátí hodnotu FALSE
    platný emailVrátí FALSE, pokud hodnota není platná e-mailová adresa
    platná_ipPokud adresa IP není platná, vrátí hodnotu FALSE
    zápasyVrátí FALSE, pokud prvek neodpovídá hodnotě jiného prvku pole
    alfaVrátí FALSE, pokud prvek obsahuje více než jen písmena
    valid_captchaVrátí FALSE, pokud hodnota v poli relace není rovna hodnotě pole formuláře
    platné datumPokud prvek obsahuje neplatné datum, vrátí hodnotu FALSE

    Většina těchto pravidel používá filtry, které se staly dostupnými v PHP 5.

    Pokud chcete, můžete sadu pravidel pro ověřování vždy rozšířit přidáním nezbytných funkcí do třídy Validator.

    Chcete-li získat zpracovanou hodnotu dat POST, použijte následující metodu:

    Zobrazit kód PHP

    Obvykle se tato metoda volá k vymazání formuláře po úspěšném zpracování formuláře.

    Dobrý večer všem (spíš noc – pozn. red.). Dnes to trochu vylepšíme. Nejprve se naučíme, jak provádět ověřování formulářů v PHP a provádět některé bezpečnostní manipulace.

    Podívejte se tedy na níže uvedený kód a poznamenejte si následující změny a následující důvody změn. Všechny nové řádky jsem zvýraznil barvou.

    Název polí formuláře byl změněn. Můžete se ptát – proč to sakra potřebujeme? Je to jednoduché, odpovím vám. Pokud vím, někteří spamovací roboti prohledávají stránky, hledají formuláře a vyplňují je na základě názvů těchto polí. Teoreticky, pokud nenajdou shodu, pak jdou domů, což je to, co chceme. Samozřejmě si nemyslím, že stupeň této ochrany je nějak zvlášť velký, ale neublíží nám to, a pokud se spamové e-maily sníží o 1 písmeno, bude to dobré =).

    Kontrola, zda je e-mailová adresa zadaná správně. Řádek 17 používá operátor elseif, který bude zkontrolován, pokud se nám vrátí kladná odpověď, to znamená, že e-mailová adresa vůbec chybí, tedy nebyla zadána. Zde využíváme funkci preg_match, která nám umožňuje porovnat zadanou adresu s regulární výraz. Možná se o regulárních výrazech krátce rozepíšu později, ale prozatím se vyplatí vědět, že regulární výraz vytváří jakousi šablonu, podle které se kontroluje náš řetězec. A pokud se v našem případě zadaná adresa neshoduje s výrazem, opět se zobrazí chyba. Zde je například několik dalších regulárních výrazů:
    |^[-а-яе\s\.,;:\?!]+$|i– tento regulární výraz umožňuje používat pouze ruskou abecedu a některé znaky, jako je mezera, tečka, čárka atd.
    #http://[-a-z0-9_.]+[-a-z0-9_:@&?=+,.!/~*’%$]*\.(html?|php)#i– a tento výraz vám umožňuje zkontrolovat správný pravopis adresy na internetu.

    Dále použijeme operátor else, kam již byl přenesen veškerý náš kód pro odeslání dopisu. Ověřovací pravidla si můžete vytvořit sami v libovolném množství, stačí přidat nová, pokud třeba pro kontrolu emailové adresy, a budete spokojeni.




    Kontaktní osoba:



    Kontaktní e-mail:



    Zpráva:






    Takto můžete ověřit své formuláře PHP, aniž byste se uchýlili k čemukoli cizímu. Myslím, že příště v příspěvku na téma formulářů bude zvážena validace formulářů v jQuery. Zatím čekám na vaše komentáře a přání. Dobrou noc a krásné ráno všem =).

    Tato a další kapitoly ukazují, jak používat PHP k ověřování dat formuláře.

    Ověření formuláře PHP

    Myslete na BEZPEČNOST při zpracování formulářů PHP!

    Tyto stránky ukážou, jak zpracovávat formuláře PHP s ohledem na bezpečnost. Správné ověření dat formuláře je důležité pro ochranu formuláře před hackery a spammery!

    HTML formulář, se kterým budeme v těchto kapitolách pracovat, obsahuje různá vstupní pole: povinná a volitelná textová pole, přepínače a tlačítko pro odeslání:

    Pravidla ověření výše uvedeného formuláře jsou následující:

    Pravidla validace v terénu
    název Požadované. + Musí obsahovat pouze písmena a mezery
    E-mailem Požadované. + Musí obsahovat platnou e-mailovou adresu (s @ a .)
    webová stránka Volitelný. Pokud existuje, musí obsahovat platnou adresu URL
    Komentář Volitelný. Víceřádkové vstupní pole (textová oblast)
    Rod Požadované. Je třeba vybrat jednu

    Nejprve se podíváme na prostý HTML kód formuláře:

    Textová pole

    Pole jména, e-mailu a webu jsou prvky pro zadávání textu a pole komentáře je textová oblast. HTML kód vypadá takto:

    Název:
    E-mailem:
    Webová stránka:
    Komentář:

    Přepínače

    Pole pohlaví jsou přepínače a kód HTML vypadá takto:

    Rod:
    ženský
    mužský
    jiný

    Prvek formuláře

    HTML kód formuláře vypadá takto: