Na navigaci | Klávesové zkratky

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 #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. ?

    před 19 lety | reagoval [2] David Grudl
  2. David Grudl #2

    avatar

    #1 tarku, představ si, že někde zapomeneš přihlašovací link alá #stary-odkaz-#stary-odkaz-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 19 lety | reagoval [3] tark
  3. tark #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 19 lety
  4. Onecar #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 18 lety
  5. mstar #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 17 lety

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


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.