« 1 2 »
Autor Zpráva
joe
Profil
V diskuzi „Přepínání stránek na webu“ napsal lordfrikk, že použití $_REQUEST může přijít později hodně draho. Tak se ptám proč. Protože důvody, které zmiňuje (převzal) mi nepřijdou jako důvody nepoužívat ho.

Prosím nedoporučujte, aby lidé používali $_REQUEST. Stejně tak jim můžete rovnou říct, ať si zase zapnou register_globals. Používejte $_GET, $_POST, $_SESSION, $_COOKIE, $_SERVER atd. pro jednotlivé zdroje dat. $_REQUEST je jenom o lenosti a jde ruku v ruce s většinou stejných problémů, které nakonec zapříčinily defaultní vypnutí register_globals.

O lenosti to není, $_REQUEST je daleko delší než psaní $_POST nebo $_GET ;-)

(1) Zkusil jsem si to následujícím příkladem:
<?php
session_start();

$_SESSION['session'] = "1";
$_COOKIE['cookie'] = "2";

echo "<b>SESSIONS:</b> ";
print_r($_SESSION);
echo "<br>";

echo "<b>COOKIES:</b> ";
print_r($_COOKIE);
echo "<br>";

echo "<b>REQUEST:</b> ";
print_r($_REQUEST);
echo "<br>";

?>


Výsledek: nejde přistupovat přes $_REQUEST k obsahu sessions nebo cookies. Alespoň u mě ne :-) Možná, že se to dá nastavit někde v PHP.

Jediný, kdo vždycky obhaujeje $_REQUEST, jsou nováčci nebo lidé, kteří nemají s PHP mnoho zkušeností. Je to prostě špatný zvyk, takže doporučuju se jej zbavit.
Naprostý nesmysl.

Každá aplikace, která používá $_REQUEST je s největší pravděpodobností napadnutelná za pomocí útoku zvaného Delayed Cross Site Request Forgery. (Což jednoduše řečeno znamená, že pokud budeme mít např. cookie pojmenovanou age pak vždy přepíše všechen obsah z GET/POST a tudíž pak skript provádí nechtěné požadavky).
viz. 1

---

Tak se tedy ptám, proč by mělo být použití $_REQUEST nebezpečné?! Není to žádná narážka, ale opravdu yb mě to samotného zajímalo. Používáte $_REQUEST nebo ne a proč?
srigi
Profil
Co takto snaha o obranu pred CSRF (stvrty odstavec).
joe
Profil
srigi
Ale přesto nevidím rozdíl mezi použitím $_POST a $_REQUEST. V tomto případě se to musí (mělo by) ošetřovat u obou způsobů nebo ne?

---

Aha, už mi to došlo :-)

---

Ale jak je v článku teké napsáno, posílání metodou POST není o moc složitější. Takže z toho pořád nevidím důvod proč (ne)používat $_POST / $_REQUEST
srigi
Profil
A co takto otazku otocit. Preco pouzivas $_REQUEST? IMHO je pre mna vyhodnejsie hladat udaje z formularov v $_POST, z URL v $_GET, je tak vacsi poriaok v aplikacii. (kua co je s forom, nejde davat ENTER do textarei).
joe
Profil
hladat udaje z formularov v $_POST, z URL v $_GET
Protože v $_REQUEST mám jak údaje z formulářů posílaných metodou POST, tak i pomocí GET. Přijde mi to jednodušší, na co to zbytečně rozdělovat :-)
PS: Enter v Opeře funguje.
karbon
Profil *
joe
Přijde mi to jednodušší, na co to zbytečně rozdělovat :-)
Někdy se právě může stát, že bude použit stejný název pro proměnnou GET i POST (zvláště u velkých projektů). Pak může použití REQUEST tropit problémy. S odděleným GET a POST se toto nemůže stát. Ale každý používá způsob jemu vlastní, možná se mu jednou vymstí, možná ne.
joe
Profil
karbon
To ano, to může. Ale existuje i jiný důvod, proč $_REQUEST nepoužívat nebo ne? Chce to jen správně pojmenovávat proměnné, pak se nic takového stát nemůže. A podle mě, používat dvě stejně pojmenované proměnné pro $_GET nebo $_POST není moc dobrý nápad, protože se to může třeba někdy plést.
YoSarin
Profil
Osobně $_REQUEST používám v prípadě že potřebuju na nějakou stránku přistoupit jak pomocí odkazu, tak přes formulář... Bezpečnostní rizikov tom nevidím žádné - $_GET, $_POST i $_COOKIE jde triviálně podstrčit v prohlížeči a $_SESSION se do $_REQUEST nepřevádí (jak píše joe). Jediný problém může nastat ve chvíli kdy mám stejné proměnné v $_POST i $_GET - tedy posílám zároveň post i get proměnné (což IMO není zas až tak obvyklé) a zároveň (v tom formuláři který to posílá) mám dvě pole stejného názvu (resp. jedno pole ve formuláři a druhou proměnnou v url akce).
souki
Profil
Já používám jen $_REQUEST. POST jde velmi snadno podvrhnout, takže rozdíl v bezpečnosti nevidím. A že se může skřížit jméno v GET a POST u větších projektů? Nesmysl. Pokud nepoužíváte hrubě špatně globální proměnné, tak se to stane poměrně těžko. Obvykle se zpracovává jen pár proměnných. Pokud je to třeba nějaká velká tabulka políček, tak jsou obvykle stejně posílány jako pole,
Rius
Profil
$_GET nepoužívám, kazí mi to hezké url a proto $_POST forever. $_REQUEST co to je? :D
souki
Profil
Rius
Cože?
srigi
Profil
Mno od peknych URI je tu mod_rewrite, ze ano.
Aesir
Profil
1.) Pole $_REQUEST od verze PHP 4.3.0 obsahuje pouze obsah proměných $_GET, $_POST and $_COOKIE, ve starších verzích obsahoval ještě $_FILES, ale $_SESSION neobsahoval nikdy, takže příklad z prvního příspěvku je mírně zcestný, stačilo si přečíst manuál.

2.) Náznak zneužitelnosti:

if (isset($_REQUEST['login_name'])) {
    echo 'Přihlášen jako ' . $_REQUEST['login_name'];
} else {
    echo 'Anonymní';
}  


Předpokládejme, že programátor očekává v cookie jménem login_name jméno přihlášeného uživatele. Při nevhodném nastavení direktivy variables_order můžu jednoduchým zavoláním page.php?login_name=cokoliv změnit data cestou, kterou programátor neočekává.

Použití ve výukovém příkladu pro začátečníky je dle mého názoru tedy nevhodné.
souki
Profil
Aesir
Já tedy používám $_REQUEST pro přístup k POST a GET bez rozdílu. Ke cookies a dalším přistupuji přes jejich pole.
Aesir
Profil
souki:
Vsadím se, že vy máte určitě i ošetřené skripty proti XSS a SQL injection atd. ;) Proto jsem psal, že je to nevhodné do výukových příkladů, toť můj názor.
souki
Profil
Aesir
No já mylsím, že i v těch výukových je zbytečné komplikovat začátečníkům život rozílem mezi post a get. U cookies je to samozřejmě jiná.
Dranel
Profil
souki
A já zase myslím, že je jedno, jestli mám REQUEST, COOKIES a SESSION nebo GET, POST, COOKIES a SESSION. Ba naopak myslím, že druhá možnost je přehlednější.
souki
Profil
Dranel
Která možnost je druhá?
joe
Profil
V prvním příspěvku má být
setcookie("cookie", "test");


Cookies obvykle moc nepoužívám a tak to pak spletu když to mám napsat a divím se, že to nefunguje :)

Aesir
Ještě ale napiš, kdo ukládá přihlašovací údaje do cookies ;)
Aesir
Profil
joe:
Ještě ale napiš, kdo ukládá přihlašovací údaje do cookies ;)

Prosím nechytejte mě za slovo, myslím, že jsem jasně napsal, že jde o náznak a stejně tak si myslím, že znežitelnost je tam více než zřejmá - nebavme se o konkrétních příkladech - myslím tím, všeobecně, že nám přijdou data z jiného zdroje než čekáme.

Stejně jako jsem vyjádřil názor, že si myslím, že ve výukových příkladech je lepší použít proměnné dle konkrétního zdroje, tak stejně tak je mým názorem, že nemá smysl debatovat nad tím, jestli je pro člověka, věci a možných problémů znalého, lepší používat $_REQUEST či nikoliv, takže to ode mě nečekejte :)
Dranel
Profil
souki
...jestli mám REQUEST, COOKIES a SESSION nebo GET, POST, COOKIES a SESSION...
Slůvko nebo odděluje první a druhou možnost.
souki
Profil
Dranel
Zároveň, ale slučuje.
A jelikož je obvykle úplně jedno, jestli informace přijde přes post nebo get, tak mi přijde mnohem jenodušší používat jednotně REQUEST
Dranel
Profil
souki
Obvykle jedno. Tím myslíš vyhledávání a informace z registrace (vč. hesla)?
souki
Profil
Dranel
Ano. V čem by tam měl být problém?
Měsíček
Profil
"A jelikož je obvykle úplně jedno, jestli informace přijde přes post nebo get,"

Ne to jedno podle mě není, já třeba ve svých aplikacích tyhle dvě superglobální proměnné striktně odlišuji a používání $_REQUEST[] je stejné zlo jako @, povolené register_globals atd ...
Dranel
Profil
Měsíček
Má slova.
souki
Profil
Měsíček
Ale proč je odděluješ?
Měsíček
Profil
Můj zvyk a moje pojetí přehlednosti.
YoSarin
Profil
Ještě pořád tu nikdo nenastínil kde je ta zneužitelnost $_REQUESTu...
případné "křížení" názvů $_GET a $_POST se mi jeví jako hodně nepravděpodobné, horší je to s "křížením" $_GET|$_POST s $_COOKIE... ale ani to se mi nejeví jako nějak kritické... Co se týká nevhodného nastavení direktivy variables_order, je to jako tvrdit, že auto není bezpečné, protože když si nezapnete pásy zabijete se...
Bart
Profil
Chtěl bych se zeptat pokud mám index.php a mám horní a levé menu, pomocí horního menu přepínám levé menu, pomocí levého menu přepínám obsah stránky. Jak se to dá řešit? Teprve začínám, dokáže někdo poradit? Při kliknutí na např.odkaz v horním munu Cest se zobrazí nabídka Informace a novinky, při kliknutí na novinky se zobrazí novinky, ale levé menu se změní na Hlavní stránku nevím co s tím.

index.php

<div id="hornimenu">
<a href="index.php?menu=hlavni">Hlavní stránka</a>
<a href="index.php?menu=cest">Cest</a>
<a href="index.php?menu=dopravci">Dopravci</a>
</div>

<div id="horni_menu">
<?
if (!isset($_REQUEST['menu'])) { include ("menu/hlavni.php"); };
if ($_REQUEST['menu'] == 'hlavni' ) { include ("menu/hlavni.php"); };
if ($_REQUEST['menu'] == 'cest' ) { include ("menu/cest.php"); };
if ($_REQUEST['menu'] == 'dopravci' ) { include ("menu/dopravci.php"); };
?>
</div>

<div id="obsah">
<?
if (!isset($_REQUEST['stranka'])) { include ("uvod.php"); };
if ($_REQUEST['stranka'] == 'olomouc' ) { include ("region/olomouc.php"); };
if ($_REQUEST['stranka'] == 'prostejov' ) { include ("region/prostejov.php"); };


if ($_REQUEST['stranka'] == 'informace' ) { include ("ces/informace.php"); };
if ($_REQUEST['stranka'] == 'novinky' ) { include ("ces/novinky.php"); };


if ($_REQUEST['stranka'] == 'karel' ) { include ("karel.php"); };
if ($_REQUEST['stranka'] == 'ondra' ) { include ("ondra.php"); };
if ($_REQUEST['stranka'] == 'peta' ) { include ("peta.php"); };
?>
</div>


hlavni.php
<div id="levemenu">
<a href="index.php?stranka=olomouc">Olomouc</a>
<a href="index.php?stranka=prostejov">Prostějov</a>
</div>
« 1 2 »

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: