Session IE regenerace id – duplicitní

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jiří Nápravník
Člen | 710
+
0
-

Nesetkal se někdo s problémem sessions v IE? Podotýkám na ůvod, že jsem cache a cookies prohlížeče pročistil, většinou to problém vyřeší.

O co jde? Přijdu na web, přihlásím se, vše funguje v pořádku, pak zavřu prohlížeč, po čase jej zase otveřu jdu na přihlašovací stránku. Přihlásím se, ale ejhle, jsem hned vykonput, že nejsem přihlášen. Když sleduju network komunikaci, vidím, že se posílá dvakrát cookie s dvěma různými hodnotami. Nepomůže nic, než zase vzít smazat cookies přes prohlížeč a pak se přihlásím. Pomohlo mi až zasáhnutí do zdrojáků nette kde jsem dal na začátek regenerateId return, aby se neregenovala, což samozřejmě není nic hezkého… Jak to vyřešit. Podotýkám, že se to týká jen IE, ale bohužel většina redakce použíává právě jej…

Pavel Macháň
Člen | 282
+
0
-

Jiří Nápravník napsal(a):

Nesetkal se někdo s problémem sessions v IE? Podotýkám na ůvod, že jsem cache a cookies prohlížeče pročistil, většinou to problém vyřeší.

O co jde? Přijdu na web, přihlásím se, vše funguje v pořádku, pak zavřu prohlížeč, po čase jej zase otveřu jdu na přihlašovací stránku. Přihlásím se, ale ejhle, jsem hned vykonput, že nejsem přihlášen. Když sleduju network komunikaci, vidím, že se posílá dvakrát cookie s dvěma různými hodnotami. Nepomůže nic, než zase vzít smazat cookies přes prohlížeč a pak se přihlásím. Pomohlo mi až zasáhnutí do zdrojáků nette kde jsem dal na začátek regenerateId return, aby se neregenovala, což samozřejmě není nic hezkého… Jak to vyřešit. Podotýkám, že se to týká jen IE, ale bohužel většina redakce použíává právě jej…

Pokud jde o platnost session pro více subdomén tak jsem měl stejný problém viz https://forum.nette.org/…ro-subdomeny#… , ale nevyřešil

Editoval EIFEL (19. 4. 2014 1:04)

enumag
Člen | 2118
+
0
-

Pokud se správně pamatuju tak je to tám že se regenerate id volá dvakrát. Tzn. pokud do té metody přidáš ochranu aby při druhém volání nedělala nic, mělo by to pomoct.

Btw. co máš za verzi Nette? Měl jsem pocit že to už někdo opravoval.

Editoval enumag (19. 4. 2014 1:07)

Jiří Nápravník
Člen | 710
+
0
-

Eifel: nn, tady neni na vice domen, je to na jednu domenu. Jedina nestandardnost je, ze mam vlastni cookie name.

Enumag mám nette 2.1.2 – poslední stable. Jak to myslíš s tou ochranou při druhém volání? Nějak jsem zmaten..

enumag
Člen | 2118
+
0
-

Hmm ona tam ta ochrana už je ($this->regenerated) takže nechápu jak se ti to může regenerovat dvakrát.

EDIT: Aha, ledaže z nějakého důvodu vícekrát voláš Session::start(): https://api.nette.org/…ion.php.html#… a mezi tim ještě Session::close() nebo Session::destroy().

Editoval enumag (19. 4. 2014 11:03)

Jiří Nápravník
Člen | 710
+
0
-

NN, necacrhuji nijak se session, v configu mam jenom tohle:

session:
	expiration: 100 days
	autoStart: TRUE
	name: PHPSESSIDMM

a pak klasicky signpresenter s loginem.

Ja nevim, jestli se regerenuji dvakrat, ale proste mam najednou dve cookies s nazvem PHPSESSIDMM, ktere se posilaji a to tam vadi

Jiří Nápravník
Člen | 710
+
0
-

Tak jsem přišel konečně na problém. Nevím jeslti je to chyba v IE nebo v Nette, ale myslím si, že by bylo záhodno, kdyby tohle Nette řešilo.

Mám web na
example.com
administraci na
admin.example.com

aplikace ma automaticke startovani session, přes neon.

Jdu na example.com a tam pracuji, je tam Cookie jedna, vše v pořádku, nikde tam se session nepracuji, jen se session nastartuje diky autostartu. Globální expirace je 100 dní

Ukázka komunikace:

Směr		Klíč	Hodnota	Platí do	Doména	Cesta	Zabezpečené	Pouze HTTP
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	nette-browser	3zfwiyzwbh
Odesláno	__gfp_64b	Cv2GB_xL_j7e8MXHPQjpyQZQ5H86tyOHCuxOsggZA9L.E7
Odesláno	bblosync	1398254290082
Odesláno	ibbid	BBID-01-00729683000800893
Přijato		PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3	Fri, 01-Aug-2014 11:58:22 GMT		/	Ne	Ano
Přijato		nette-browser	3zfwiyzwbh	Konec relace		/	Ne	Ano

jdu na admin.example.com. Tady je přihlášení takto: $this->userService->setExpiration(3600, TRUE); – či-li po zavření prohlížeče se smazné session.
při načtení pořád jedna Cookie PHPSESSIDMM se stejnou hodnotou.
Když se přihlásím v pořádku, vše funguje a mohu pracovat stále. Zavřu prohlížeč, jdu na admin.example.com

Komunikace:

Směr		Klíč	Hodnota	Platí do	Doména	Cesta	Zabezpečené	Pouze HTTP
Odesláno	nette-browser	bajelo21a2
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	nette-browser	3zfwiyzwbh
Odesláno	__gfp_64b	Cv2GB_xL_j7e8MXHPQjpyQZQ5H86tyOHCuxOsggZA9L.E7
Odesláno	bblosync	1398254290082
Odesláno	ibbid	BBID-01-00729683000800893
Přijato		PHPSESSIDMM	al9sp8927rhvl164a5nkj2tg52	Fri, 01-Aug-2014 12:00:47 GMT		/	Ne	Ano
Přijato		nette-browser	bajelo21a2	Konec relace		/	Ne	Ano

Přihlásím se a jsem hned vyhozen, odhlášen.

Komunikace po kliku na tlačítko, tedy při handleru obsluhujícím forumlář (tam proběhne přihlášení a redirect do zabezpečené části)

Směr		Klíč	Hodnota	Platí do	Doména	Cesta	Zabezpečené	Pouze HTTP
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	__gfp_64b	Cv2GB_xL_j7e8MXHPQjpyQZQ5H86tyOHCuxOsggZA9L.E7
Odesláno	ibbid	BBID-01-00729683000800893
Odesláno	PHPSESSIDMM	qc8cbb647jeacmjesi6q2n2ti0
Odesláno	nette-browser	m3j9jww40a
Přijato		PHPSESSIDMM	c13ahleeo854n0ojmt5nrngo97	Fri, 01-Aug-2014 12:09:15 GMT		/	Ne	Ano
Přijato		nette-browser	m3j9jww40a	Konec relace		/	Ne	Ano

Komunikace v zabezpečené části, kde jsem vykopnut, protože nejsem údajně přihlášen:

Směr	Klíč	Hodnota	Platí do	Doména	Cesta	Zabezpečené	Pouze HTTP
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	__gfp_64b	Cv2GB_xL_j7e8MXHPQjpyQZQ5H86tyOHCuxOsggZA9L.E7
Odesláno	ibbid	BBID-01-00729683000800893
Odesláno	PHPSESSIDMM	qc8cbb647jeacmjesi6q2n2ti0
Odesláno	nette-browser	m3j9jww40a
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	__gfp_64b	Cv2GB_xL_j7e8MXHPQjpyQZQ5H86tyOHCuxOsggZA9L.E7
Odesláno	ibbid	BBID-01-00729683000800893
Odesláno	PHPSESSIDMM	qc8cbb647jeacmjesi6q2n2ti0
Odesláno	nette-browser	m3j9jww40a
Odesláno	PHPSESSIDMM	f1e5bptqu3hf9ob9ojrkorp8p3
Odesláno	__gfp_64b	Cv2GB_xL_j7e8MXHPQjpyQZQ5H86tyOHCuxOsggZA9L.E7
Odesláno	ibbid	BBID-01-00729683000800893
Odesláno	PHPSESSIDMM	c13ahleeo854n0ojmt5nrngo97
Odesláno	nette-browser	m3j9jww40a
Přijato		PHPSESSIDMM	lepg1smn6kbv98tnbkbrdfgtf3	Fri, 01-Aug-2014 12:09:16 GMT		/	Ne	Ano
Přijato		nette-browser	m3j9jww40a	Konec relace		/	Ne	Ano

a nejde se proste prihlasit vubec, porad se opakuje stejný scenář, přihlášení a následný redirect zpet na přihlášení, protože nejsem přihlášen.

Je případně nějaký workaround, jak to vyřešit, aniž bych zakazoval regenerateId?

matopeto
Člen | 395
+
0
-

Nebude to rovnaky problem ako tu: https://forum.nette.org/…e-prihlaseni

Jiří Nápravník
Člen | 710
+
0
-

To asi nebude to same. Ja se prihlasim prvne v pohode, pak to nejde, viz ta komunikace.

Napada me, nemuze to byt tim, ze u tech cookies neni nastavena domena? Treab v chrome apod. mam cookie domenu tech session admin.example.com, prip. example.com. V IE je to pole (aspon podle debugbaru) prazdne.

Kdyz koukám tak v msdn.com píšou tohle (viz níže), nemůže to býte ten problém, že pak v podsatě, kdyžý nezadává Nette u sessiony cookie_domain, tak je pak vidět na admin.example.com i ta z example.com a dělá to pak bordel?

Q3: If I don’t specify a DOMAIN attribute when a cookie, IE sends it to all nested subdomains anyway?

A: Yes, a cookie set on example.com will be sent to sub2.sub1.example.com.

Internet Explorer differs from other browsers in this regard. Here’s a test case.
Jiří Nápravník
Člen | 710
+
0
-

Tak to vypada, ze problem je orpavdu v tom, ze prazdne cookie_domain bere IE nějak nestandardně, když jsem do extension dal:

	public function beforeCompile()
	{
		parent::beforeCompile();

		$session = $this->getContainerBuilder()->getDefinition('session');
		$session->addSetup('setCookieParameters', ['/', $_SERVER['SERVER_NAME']]);
	}

což v podstatě jen nastaví cookie_domain pro tu konkretni domenu. A je po problemu, nebo aspon se to tak tváří:-)

Je to na bug report? Mělo by to Nette řešit?

EDIT: tak pry klientovi to stejne nejde, i kdyz promazne vsechny cache:/

Editoval Jiří Nápravník (24. 4. 2014 2:17)