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
tark #1
Blbě… Každopádně do mých apps by se nedostal, protože nezná heslo. 😁
David Grudl #2
#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=abcd
a 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í.
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. :)
Onecar #4
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..mstar #5
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
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.