Upload souboru z Flashe + ověření uživatele

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

Řeším teď upload souboru z Flashe (YUI Uploader, SWFUpload) přihlášeným uživatelem (Nette/User), tzn. na server se musí dostat cookies.

První problém je v tom, že Flash Player v prohlížečích jiných než IE neposílá cookies (podle http://developer.yahoo.com/yui/uploader/#…), případně posílá cookies z IE, ne z prohlížeče, ve kterém běží (podle http://swfupload.org/…scussion/383).
To lze vyřešit tak, že společně se souborem se ty cookies pošlou v POSTu, YUI Uploader i SWFUpload to bez problémů umí. S Nette je to trochu složitější (a bezpečnější), protože PHPSESSID i „nette-authkey“ jsou httponly cookies, takže nejsou z javascriptu dostupné. „Řešením“ je poslat si je ze serveru v HTML kódu stránky.

V PHP skriptu, který řeší ten upload souborů, je pak potřeba ty hodnoty zase z $_POST nastavit do $_COOKIES a do session_id() a pak ověřit přihlášení uživatele ( user->isAuthenticated() )

A zde nastává druhý problém, který už nevím, jak vyřešit. Prostě uživatel stejně přihlášený není a vygeneruje se nové session_id.
Podle toho, co jsem se dočetl na fóru (https://forum.nette.org/…iewtopic.php?…) má Nette ochranu proti ukradení session (podle některých HTTP hlaviček). Předpokládám, že je to porovnává s předchozím požadavkem. Pokud ne, rád se dovím, jak to funguje.
Pokud ano, tak je asi skoro jisté, že hlavičky budou jiné při požadavku z prohlížeče oproti požadavku z Flash Playeru, takže Nette to vidí jako ukradenou session, takže vygeneruje nové session_id a uživatele to neověří. Přesně takhle se mi to chová, uživatel není přihlášený a je nové session_id.

Takže se chci zeptat, jestli ta ochrana proti ukradení session (resp. rozdíl v HTTP hlavičkách) může být příčinou, případně jestli tu ochranu lze ve skriptu nějak programově vypnout.

Díky za radu.

Jod
Člen | 701
+
0
-

A nevieš to riešiť nejakým iným identifikátorom než je session_id? Dávnejšie sa to tu riešilo.

pmg
Člen | 372
+
0
-

Myslím, že o druhém problému píšou někde dole v dokumentaci. K odesílanému souboru je možné připojit ještě další data, čehož můžeš využít pro předání nějakého klíče. Asi bude nejlepší udělat speciální UploadPresenter, který nebude kontrolovat přihlášení uživatele. Zbytek formuláře se pak odešle normální cestou.

jirik
Člen | 2
+
0
-

Rozumím co oba myslíte. Prostě neověřovat uživatele (session), ale nějaký kód.
Díky.

David Grudl
Nette Core | 8228
+
0
-

Pokud je problém v tom ověřování HTTP hlaviček (jde o Accept-Charset, Accept-Encoding, Accept-Language, User-Agent), tak to lze vypnout pomocí Environment::getSession()->verificationKeyGenerator = FALSE

Nicméně je to potřeba vypnout globálně, to znamená pro každý request. Přemýšlím, jestli kód neupravit tak, aby se to dalo vypnout jen pro jeden konkrétní request.

washo
Člen | 88
+
0
-

jirik napsal(a):

Rozumím co oba myslíte. Prostě neověřovat uživatele (session), ale nějaký kód.
Díky.

Co za kod byste zvolili?
Myslim ze by uverovani melo fungovat podobne jako ochrana proti CSRF, ale k tomu potrebuju prave tu session ne?

//Pokud se to tu jiz resilo omlouvam se. Nemuzu to tu na foru najit

pekelnik
Člen | 462
+
0
-

Toto řešení má dvě nevýhody:

  • vypnout kontrolu user-agenta není dobrý nápad ani na tak „malicherné“ akci jako je upload souboru :)
  • posílat session id v kódu stránky není dobrý nápad vůbec

Navíc se obávám, že vypnutí kontroly user agenta nebude stačit. Problém je v tom, že při volání funkce session_id() se vždy odešle nová cookie bez ohledu na to co tam nastavíte. Viz dokumentace session_id(). Prohlížeč tedy při dalším požadavku je poněkud mimo mísu, protože požadavek od flashe mu zničil session – nová cookie samozřejmě dorazí do flashe a ne do prohlížeče.

Čistým řešením je vytvoření ticketů pro upload a ty oveřovat proti něčemu jinému než je problematická session, např. proti databázi.

PetrP
Člen | 587
+
0
-

pekelnik napsal(a):

  • vypnout kontrolu user-agenta není dobrý nápad ani na tak „malicherné“ akci jako je upload souboru :)

Kontrola user agenta stejně není kdovíjaké zabezpečení, jeho podvrhnutí i získání je triviální.

Jinak ale s ostatním souhlasím. Vytvoření jednorázového tiketu jen na tuto akci je asi nejlepší.

romansklenar
Člen | 655
+
0
-

Pokud se vám to podařilo nějak systémově vyřešit, tak by z toho byla určitě pěkná a poptávaná komponenta do extras.