session_regenerate_id() a problém s IE/Edge rubrika: Programování: PHP
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?
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:
Nebo se přihlaste jménem a heslem:
Komentáře