Klávesové zkratky na tomto webu - rozšířené Na obsah stránky

porucha není na vašem přijímači

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?

Karma body: 81. Líbil se vám článek?

Komentáře » přidat

  1. [1] tark: nový

    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

    Posláno 13. 5. 2005 ve 14.37 | Odpovědět
    Na komentář reagoval [2] David Grudl
  2. avatar [2] David Grudl: nový

    [1] tark: 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í.

    Posláno 13. 5. 2005 v 16.14 | Odpovědět
    Na komentář reagoval [3] tark
  3. [3] tark: nový

    [2] David Grudl: 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í/edita­ci/mazání taky POST, skoro na všechno post, asi tak jak říkal Radek. :)

    Posláno 13. 5. 2005 ve 22.17 | Odpovědět
  4. avatar [4] Onecar: nový

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

    Posláno 16. 9. 2006 ve 13.31 | Odpovědět
  5. avatar [5] mstar: nový

    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

    Posláno 20. 8. 2007 ve 2.07 | Odpovědět

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

Výtah na začátek článku na první komentář

Názory čtenářů v diskusích nejsou názory provozovatele webu, a ten za jejich obsah neodpovídá.

La Trine © 2004, 2008 David Grudl – o webu
provozuje Pachollini.

Jakékoliv užití obsahu, včetně převzetí článků nebo jejich částí, je bez předchozího písemného svolení autora zakázáno.

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