session_regenerate_id() a problém s IE/Edge rubrika: Programování: PHP

7 kluvi
položil/-a 20.10.2016
 
upravil/-a 20.10.2016

Měli jsme normálně funkční přihlašování uživatelů, které fungovalo v pořádku ve všech prohlížečích. Přihlašování funguje poměrně standardně:

  • formulář s loginem/heslem se odešle POSTem
  • ověří se uživatel v DB
  • přesměruje se zpátky

Co jsme udělali je to, že jsme po úspěšném ověření zavolali session_regenerate_id(). Všude to funguje bez problémů (= uživatel se přihlásí), až na vybrané verze IE11 a aktuální verzi Edge (spolehlivě to funguje na Edge co se dá stáhnout z modern.ie).

Chování například ve Chrome:

  • načtu stránku s formulářem, mám session ID AAA
  • odešlu formulář POSTem, request má stále session ID AAA
  • response na POST už má správně v set-cookie session ID BBB (+Location: YYY)
  • prohlížeč udělá request na YYY se session ID BBB
  • response nemá set-cookie, takže má opět session ID BBB
  • uživateli se zobrazí normálně stránka po přihlášení

A teď jak to funguje v IE11 / Edge:

  • načtu stránku s formulářem, mám session ID AAA
  • odešlu formulář POSTem, request má stále session ID AAA
  • response na POST už má správně v set-cookie session ID BBB (+Location: YYY)
  • prohlížeč udělá request na YYY se session ID AAA
  • response nemá set-cookie, takže má opět session ID AAA
  • uživateli se zobrazí stránka pro nepřihlášeného uživatele

Probém u Edge je pochopitelně v tom, že session AAA už je tou dobou odstraněná (parametr true u funkce) a zákazník tak přijde například o uložený košík,...

Edit: dělá to i v případě, že v response na POST není Location: YYY, ale zobrazí se normálně stránka s odkazem na přechod na YYY.

Odstranění session_regenerate_id() se problém "vyřeší", ale na úkor bezpečnosti. Setkali jste se už s podobným problémem? Jak jste problém řešili?

Komentáře

  • Anonym : "response na POST už má správně v set-cookie session ID BBB (+Location: YYY)" Jakou má tady set-cookie nastavenou domain a path? (.site.cz + / ?) 21.10.2016
odkaz Vyřešeno
7 kluvi
odpověděl/-a 21.10.2016

Odpovím si sám (a díky Honza B. za postrčení):

  • problém je v tom, že v Set-cookie neposíláme doménu (nebylo potřeba)

Rozdíl mezi IE/Edge a Chrome je v tom, že Chrome si to ukládá opravdu na doménu dle aktuální URL, ale IE/Edge to uloží na doménu bez www, ačkoliv je aktuálně na doméně s www a nikde v průběhu komunikace se to nemění (testováno Wiresharkem).

Tj vyřešeno nastavováním domény .site.cz v session_set_cookie_params()

Komentáře

  • junior779 : Velky palec za vyriesenie :-) 28.10.2016
  • kluvi : pokud by někdo chtěl, rád dodám další informace :) 31.10.2016

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.