formulář

Pokud máte za to, že Post a Get jsou bratranci Čuka a Geka, musím Vás hned předem varovat: „tento článek je určen tvůrcům webových stránek“. Takže čtěte jen tehdy, je-li webdesign Vaším čálkem šaje 😉

Při tvorbě HTML formuláře máme k dispozici dvě metody, jak odeslat data zpět serveru: POST a GET. Data odeslaná metodou GET se stanou součástí URL, doplní se za otazník a jsou tedy vidět v adresním řádku prohlížeče. Naopak metoda POST data odesílá odděleně od URL. Předpokládám, že tohle asi všichni znáte.

Zkusme jít trošku do hloubky. Metodu GET není třeba spojovat jen s formuláři. Jakékoliv stažení objektu ze serveru je provedením příkazu GET. Vyvolá jej každé kliknutí na odkaz <a href=...>, transparentně jej provede <img src=...>.

POST je ryze formulářová záležitost. Jak jsem uváděl, data se odesílají mimo URL – to se ovšem týká jen položek formuláře. Zároveň je totiž možné odesílat ještě další data v URL, které je uvedeno v action formuláře. Zjednodušeně řečeno, POST umí totéž co GET a ještě o dost víc.

Kdy použít GET a kdy POST?

Protože často tvořím internetové aplikace, kde se to formuláři jen hemží, snažil jsem se odvodit nějaké univerzální pravidlo, kdy použít kterou metodu:

Použijte POST, pokud

  • odeslání formuláře způsobí vnitřní změnu serveru (zápis do databáze, odeslání e-mailu, …) čtěte poznámku 1
  • odesílaná data nejsou zcela veřejná
  • velikost dat může překročit 1000 bajtů (čtěte poznámku 2)

V ostatních případech lze použít GET.

Toto pravidlo mějte na zřeteli i tehdy, když tvoříte „GET bez formuláře“, tedy prostý odkaz <a href=...?paramtery>. Pokud pravidlo říká, že je třeba použít POST, nahraďte přímý odkaz formulářem POST s tlačítkem. Nebo alespoň změňte odkaz tak, aby vedl na potvrzovací formulář. A teprve po jeho odkliknutí proveďte akci. Je to především opatření proti robotům, kteří by mohli při procházení webu nadělat škodu.

Poznámka 1: Při zpracování položek formuláře je třeba ověřit, zda byly skutečně odeslány jako POST. V PHP pomůže důsledné používání superglobálního pole $_POST.

Pokud je nežádoucí, aby refresh stránky nebo návrat v historii prohlížeče způsobil znovuodeslání formuláře, přesměrujte se po zpracování na další stránku hlavičkou Location:

header('Location: http://www.example.com/');

Poznámka 2: Pokud formulářem odesíláte soubory, nezapomeňte mu nastavit enctype="multipart/form-data".

Jde o zabezpečení

Zde uvedené principy a pravidla mají za úkol jediné: pomoci zabezpečit Váš web či aplikaci. Ať už před koumákem, který se ji pokouší nabourat záměrně, nebo před robotem, který tak činní v tupé nevinnosti.

Roboti zkoumající Váš web zkusí otevřít každou adresu, stáhnout každou stránku. Je to jejich úkol a dost možná, že je to i baví. Jediná věc, před kterou se zastaví, jsou formuláře. A právě proto jsem varoval před odkazy, které suplují formuláře. Je třeba je používat s rozvahou.

p.s.: Jste-li autorem webové aplikace, zkuste se zamyslet: jak by to dopadlo, kdyby se do administrační části náhodou dostal robot?