LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (25) - Formuláře - nikomu nevěřte

Při zpracování dat z formulářů musíme být opatrní - a data ověřovat. Uživatelé se totiž dříve nebo později pokusí podstrčit nám neplatná data.

16.7.2004 15:00 | Petr Zajíc | Články autora | přečteno 134525×

Komerční sdělení: Pořádáme Kurzy PHP

Je hezké, že umíme zpracovávat data pomocí formulářů - ale je tu ten lidský prvek. Data z formulářů nepocházejí od počítačů, ale od lidí. Protože v reálné aplikaci na tom většinou záleží, bude potřeba data ověřovat. E-mailové adresy, telefonní čísla, webové adresy a spousta dalších věcí se dají alespoň primitivně ověřit. Navíc, někdy může formulář být terčem útoku - a nedostatečné ověření může způsobit "díru" do naší aplikace.

Jednoduché ověřování

Protože data z formuláře jsou k dispozici jakožto proměnné ve skriptu, může nejjednodušší ověřování spočívat v kontrole těchto proměnných. Takže, primitivní skript který ověří e-mailovou adresu:

<?
  
function JeEmail ($cislo)
  {
    return
ereg("^.+@.+\..+$",$cislo);
  }

  if (empty (
$_POST))
  {
?>
<form method="post" action="26_simple.php">
  E-mail: <input name="email">
    <input type="Submit" name="odesli">
</form>
<?
  
}
  else
  {
    if (!
JeEmail($_POST["email"])) echo "Tohle nevypadá jako e-mail";
    else echo
"Zpracovávám ". $_POST["email"];
  }
?>

Spustit skript

Toto ověřování však má zásadní problém. Uživatele jsme sice prokouknuli, ale místo všeho jiného jsme mu jen poslali varovnou hlášku. Chtělo by to něco jiného - při chybě zobrazit opět původní formulář. Což nám celý skript trošku zamotá, protože budeme muset testovat jednak to, zda již byl formulář odeslán, a jednak to, zda byl odeslán se správnými daty. Nová verze by mohla vypadat nějak takto:

<?
  
function JeEmail ($cislo)
  {
    return
ereg("^.+@.+\..+$",$cislo);
  }
  
$BudemeZobrazovat=true;
  if (!empty(
$_POST)) // tak už se odesílalo a musíme kontolovat
  
{
    if (!
JeEmail($_POST["email"]))
    {
      
// kontrolou jsme neprošli
      
echo "Tohle nevypadá jako e-mail!";
    }
    else
    {
      
// kontolou jsme prošli
      
$BudemeZobrazovat=false;
      echo
"Zpracovávám ". $_POST["email"];
    }
  }
if (
$BudemeZobrazovat):?>
  <form method="post" action="source.php">
    E-mail: <input name="email">
      <input type="Submit" name="odesli">
  </form>
<?endif;?>

Spustit skript

Skript je poměrně dost překopaný a zalouží si rozsáhlý komentář. K celému problému přistupujeme pesimisticky: předpokládáme, že ve většině případů budeme muset formulář zobrazit. Takže si na to vytvoříme logickou proměnnou $BudemeZobrazovat. Tato proměnná je ze začátku nastavena na TRUE, tedy že formulář zobrazovat budeme.

Následuje podmínka testující, zda jsme již formulář odeslali. To je postup, který jsme detailně rozebrali v minulém díle seriálu. Pokud jsme ho neodesílali, tělo podmínky se neprovede a formulář se nám zobrazí. Jestliže jsme formulář ale již odeslali, dostáváme se dovnitř, do těla podmínky, kde máme vnořenou podmínku. ("dobře, něco jsme odeslali, ale je to správně"). Pokud, a pouze pokud projdeme kontrolou, nastavíme proměnnou $ZobrazitFormular na FALSE a můžeme formulář zpracovat.

Jestliže ale testem správnosti formulář neprojde, zobrazíme varovnou hlášku ("tohle nevypadá jako e-mail") a opustíme obě podmínky. Proměnná $BudemeZobrazovat zůstala nasatavena na TRUE, takže se nám po varovné hlášce formulář zobrazí, což je přesně to, co jsme chtěli.

Na celém přístupu je príma hlavně to, že samotná definice formuláře je až na konci skriptu a neplete se nám do jeho zpracování. Ono to na první pohled nevypadá, ale některé formuláře mají více vstupních prvků a musí se provést více kontrol, takže se kód protáhne.

Profi přístup

Nakolik se Vám možná chce jásat, má náš skript jednu dosti podstatnou vadu. Když se mají údaje opravovat, chybí tam předvyplněné ty původní. Za to Vás budou chtít uživatelé lynčovat, protože kdyby formulář obsahoval deset polí a chyba by byla jen v jednom, je jasné, že by museli vyplnit všech dest polí znova (brr). Jednoduchou úpravou skriptu ale dosáhneme toho, že když jej vyplňujeme již poněkolikáté, tak tam předchozí hodnoty zůstanou:


// začátek je stejný...
if ($BudemeZobrazovat):?>
  <form method="post" action="26_complex.php">
    E-mail: <input name="email" value="<?echo $_POST["email"]?>">
      <input type="Submit" name="odesli">
  </form>
<?endif;?>

Ukázat skript | Spustit skript

Skutečně to je takto jednoduché - když se má formulář zpracovávat po několikáté, tak jsou již prvky pole $_POST k dispozici a můžete tedy použít jejich hodnoty jako výchozí hodnoty prvků formuláře.

Verze pro tisk

pridej.cz

 

DISKUZE

Varovani 16.7.2004 15:33 Michal Čihař
L Re: Varovani 17.7.2004 19:41 Petr Zajíc
Taky neco dodam :-) 17.7.2004 17:09 mysql_php
|- Re: Taky neco dodam :-) 17.7.2004 19:47 Petr Zajíc
L Re: Taky neco dodam :-) 13.7.2010 13:21 Tomáš Kováčik
Display error 20.2.2008 21:54 Dan Pelíšek
L Re: Display error 20.2.2008 21:56 Dan Pelíšek
Dotaz na POST 12.6.2009 19:19 Jan Nepovim
ereg() 26.6.2010 14:25 Oleg Matskiv
  L Re: ereg() 25.1.2013 13:55 Jan joukercz Stejskal




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

13.9.2017 8:00 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze