Jak ověřit povolená cookies?
- Šaman
- Člen | 2659
Ahoj, řeším problém jak ověřit, že má uživatel povolená cookies. Z bezpečnostních důvodů nechci předávat SESSIONID v GETu, proto chci hned při spuštění aplikace uživatele varovat (zobrazit chybu pomocí errorPresenteru). Teď to řeším takthle:
<?php
protected function startup() // zde si zkontrolujeme povolena cookies
{
parent::startup(); //zavoláme překrývanou metodu předka
// Zjistime zda funguji cookies (nutne pro session)
$session = Environment::getSession('session_test'); // získáme přístup do session
if (SID !== '') // test, zda je mozne prenaset sessionId v cookies (kdyz ne, konstanta SID obsahuje sessionId)
{
if ($_GET["cookies"] == "test") // !!! Tento řádek mi označí chybová hláška, viz popis problému níže.
{
// kdyz nefunguji, vyhodime vyjimku a zachytime ji pak ErrorPresenterem
throw new CookiesDisabledException('Aplikace vyžaduje povolené cookies!');
}
else
{
$this->redirect("default:", array("cookies" => "test"));
}
}
}
?>
Zajímavé je, že ve FF to funguje, ale v Opeře a v Safari (v Exploreru nevim) mi to vyhodí výjimku: Cannot set HTTP code after HTTP headers have been sent (output started at… viz kód).
Máte s tím někdo zkušenosti, pls? Dá se to nějak jednoduše vyřešit, nebo to chce zcela jiný přístup?
- Ondřej Mirtes
- Člen | 1536
Ahoj,
Nette je ochráněné a SID ti do URL nikdy nepřidá.
Určitě používej přidružené metody – Environment::getHttpRequest() ->getCookie() (pro zjišťování těch, co má uživatel nastavené) a Environment::getHttpResponse() ->setCookie() (pro nastavování nových cookies uživateli).
A prací se sessions se zabývá článek na Zdrojáku.
- Šaman
- Člen | 2659
Já nemám strach, že by se předávalo SID pomocí GETu, ale že uživateli
nebude fungovat aplikace, když bude mít vypnutá cookies.
Proto chci nejdříve zjistit, jestli jsou cookies povolené a když ne, tak ho
na aplikaci ani nepustit.
Trochu jsem laboroval a upravil test takto (a funguje):
<?php
// Zjistime zda funguji cookies (nutne pro session)
if (Environment::getHttpRequest()->getCookie('isEnabledCookies') != 'true') // kdyz nemame overena cookies
{
// pokud mame v GETu "isEnabledCookies" = "test", tak cookies nejsou nastavena, ackoliv jiz probehl redirect
if (Environment::getHttpRequest()->getQuery("isEnabledCookies") == "test")
{
// takze vyhodime vyjimku a zachytime ji pak ErrorPresenterem
throw new CookiesDisabledException('Aplikace vyžaduje povolené cookies!');
}
else // pokud nemame v GETu "isEnabledCookies" = "test", tak nastavime testovaci cookies a redirectnem
{
Environment::getHttpResponse()->setCookie('isEnabledCookies', 'true', 0); // zivotnost do zavreni prohlizece
$this->redirect("default:", array("isEnabledCookies" => "test"));
exit();
}
}
?>
Testuji ted primo cookies, ale muj problem to nevyserilo, pomohlo az nahradit
$_GET[] na Environment::getHttpRequest()->getQuery(). Vypada to jako ze dotaz
na $_GET[] delal neco s hlavickami, zatimco pres getQuery() je to ciste.
Otestovano na FF, Opere a Safari (vse na Macu).
- Mikulas Dite
- Člen | 756
Hm, místo výjimky CookiesDisabled bych osobně dal něco běžného, např. InvalidState. Chápu ho spíš jako interní, ale použít ho tady by bylo lepší než novou výjimku.
Editoval Mikulas Dite (17. 3. 2010 17:43)
- Honza Kuchař
- Člen | 1662
Zajímavé je, že ve FF to funguje, ale v Opeře a v Safari (v Exploreru nevim) mi to vyhodí výjimku: Cannot set HTTP code after HTTP headers have been sent (output started at… viz kód).
Když jsem začínal, taky mě to pořekvapilo, ale dělá to laděnka,
která pokud je k dispozici firebug, tak vypisuje upozornění, poznámky a
chyby do firebugu. (komunikace přes hlavičky) Kdežto v ostatních
prohlížečích firebug není → chybka se vypíše dostránky → nejdou
odeslat další hlavičky (výstup už byl odeslán) →
výjimka Cannot set HTTP code after HTTP headers have been sent (output started at