Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

Jak na formuláře: POST a GET

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?

Komentáře

  1. tark http://kanevinternetu.blacksuns.net/ #1

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

    Blbě… Každopádně do mých apps by se nedostal, protože nezná heslo. :-D

    před 12 lety | reagoval [2] David Grudl
  2. David Grudl http://davidgrudl.com #2

    avatar

    #1 tarku, představ si, že někde zapomeneš přihlašovací link alá http://tarkuv-web.cz?jmeno=tark&heslo=abcda vyhledávač jej zaindexuje. Nebo někdo záměrně pustí robota (např. wget) do Tvého webu (třeba i s heslem). A jsou případy, kdy heslo není třeba (diskuzní fóra atd).

    Tady nejde o utajení hesla, ale o tvorbu kvalitních internetových aplikací.

    před 12 lety | reagoval [3] tark
  3. tark http://kanevinternetu.blacksuns.net/ #3

    #2 Davide Grudle, ok, samozřejmě. na přihlašování samozřejmě používám jedině POST a GETem se tam nikdo nedostane… :-)

    Na přidání/editaci/mazání taky POST, skoro na všechno post, asi tak jak říkal Radek. :)

    před 12 lety
  4. Onecar http://onecar.php5.cz #4

    avatar

    GET používám takřka výhradně na určení statutu operace, třeba při přidávání komentáře přesměruju s pamametrem ?proccess=success nebo ?proccess=fail a podle toho určuju výpis textu.. jinak vždy a zásadně pouze POST..

    před 10 lety
  5. mstar http://sawfish.euweb.cz #5

    avatar

    Pls, kdybyste někdo věděli, jak odstranit opětovné odeslání dat z formuláře po obnovení stránky, proslím napište mi na mail, díky moc

    před 9 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.