Jak ověřit povolená cookies?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Šaman
Člen | 2635
+
0
-

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
+
0
-

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 | 2635
+
0
-

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
+
0
-

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)

Šaman
Člen | 2635
+
0
-

To si nemyslím. Zakázaná cookies nejsou interní chyba serveru, uživatel to může jednoduše spravit, takže jsem jim přidal samostatnou chybovou stránku. Rozlišuji err404 (pravděpodobně překlep), zakázaná cookies (s popisem jak je povolit) a err500 (všechno ostatní).

Honza Kuchař
Člen | 1662
+
0
-

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