Overeni mezi requesty dle Session ID nebo IP?

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

Zdravim,

potrebuji realizovat jednoduchou chatovaci aplikaci ala technicka podpora. Potrebuji zajistit, aby kazdy zakaznik/navstevnik mel unikatni chat a admin po prihlaseni mohl odpovidat.

Jde mi o to, jak overovat ze se jedna o toho sameho cloveka, vaham jestli pouzit https://api.nette.org/…Session.html#… ale konkretne tohoto: „Don't make dependencies, can be changed for each request.“ se mirne obavam.

Nebo se spolehat na https://api.nette.org/…Request.html#… (klasicka IP adresa)?

Potrebuji spolehlive poznat, zda se jedna jednoho a toho sameho uzivatele i mezi requesty – chat se bude ukladat normalne do db spolecne s IP nebo Session id (podle toho co mi doporucite).

Osobne se domnivam ze IP bude spolehlivejsi, rad bych slysel ale i nazory Vas, zkusenejsich.

Editoval Lexi (22. 2. 2013 14:11)

enumag
Člen | 2118
+
0
-

Session ID určitě ne, jak jsi sám již zjitil Nette ID často dle potřeby regeneruje kvůli zabezpečení proti session fixation apod.

IP nemusí být dostačující pokud se připojilo více uživatelů z jedné IP adresy. Co takhle použít kombinaci IP a User-agent?

EDIT: Po diskusi s @Majkl578 a @brabijan na jabberu bude lepší použít session a to tak že někam do session uložíš uživateli nějaký náhodně vygenerovaný identifikátor. Tzn injectneš session, tam si uděláš vlastní section a tam mu vygeneruješ ID podle kterého jej později poznáš. Kdyžtak dokumentace session by ti měla pomoct. ;-)

Editoval enumag (22. 2. 2013 14:26)

Majkl578
Moderator | 1364
+
0
-

Smím vědět, proč to nejde udělat naopak? Tzn. v session držet identifikátor chatu – pokud neexistuje, založí se nový chat, pokud existuje, použije se a pokračuje se v něm.

Jan Mikeš
Člen | 771
+
0
-

Dekuji za nazory.

S pouzitim session problem nemam – jde mi jenom o to jak rozeznat unikatni uzivatele a udrziet si jejich identitu po dobu jejich pritomnosti.

Libi se mi oba zpusoby, otazka je pouze ktery je spolehlivejsi – uzivatel si muze v prohlizeci vymazat cookies (sice nevim proc by to delal) a jeho komunikace bude pryc.. (fyzicky bude ulozena v databazi, ale on uz nebude mit moznost se k ni vratit), z tohoto hlediska si rikam ze jistejsi je reseni od @enumag

Majkl578
Moderator | 1364
+
0
-

IP a prohlížeč je rozhodně špatné řešení. Představ si společnost s 500 zaměstnanci. Všichni budou mít stejnou IP a všichni budou mít pravděpodobně předinstalované systémy, kde bude stejný OS, stejný prohlížeč a stejná konfigurace všeho. Jak těch 500 lidí rozlišíš?

enumag
Člen | 2118
+
0
-

@Majkl578: Máš samozřejmě pravdu, tvůj identifikátor ukládaný v session je mnohem lepší. :-)

hAssassin
Člen | 293
+
0
-

ano, souhlasim, ale otazkou zustava, kde nebo jak tento identifikator ziskat?

Majkl578
Moderator | 1364
+
0
-

Podíváš se do session, zda tam existuje. Pokud ano, použiješ ho, pokud ne, založíš nový chat.

enumag
Člen | 2118
+
0
-

@hAssassin: Nový identifikátor bych generoval přes Strings::random().

hAssassin
Člen | 293
+
0
-

@Majkl578: pokud to byla reakce na me, tak sem nemyslel „odkud“ ale „odkud“, cili jak ji generovat aby byla skutecne unikatni.

@enumag: jo, to me taky napadlo, a asi to unikatni bude, ale nejaka pravdepodobnost stejne asi existovat muze, ze se vygeneruji dva stejny retezce pro dva jiny lidi a pak to kixne na tom, ze ten druhej „vstoupi“ do konverzace toho prvniho a to muzu byt pruser velikansky (zalezi teda o cem ta komunikace byla).

enumag
Člen | 2118
+
0
-

@hAssassin: Anebo uniqid.

Majkl578
Moderator | 1364
+
0
-

Já vás asi nechápu.

Zkusím to popsat v krocích, tak, jak to myslím.

  1. Uživatel přijde na web. Tím zároveň získá session s platností např. 30 dní.
  2. Chvíli web používá a následně se v něm ztratí a bude chtít pomoci.
  3.  
    1. Začne chat. Tím se někde v databázi vytvoří záznam o konverzaci (předpokládejme tabulku conversations). Tento záznam bude mít unikátní ID (tím je primární klíč, ID konverzace).
    2. Výše uvedené ID se uloží do session uživatele.
  4. Oba si následně pokecají, jejich zprávy padají někam do tabulky conversations_messages.
  5. Uživatel je happy a jde surfovat dál.
  6. Po půl hodině ale zabloudí znovu a chce si o tom popovídat.
  7. Začne znovu chat. Jelikož ale v session existuje ID konverzace (vytvořené v bodě 3b), nezaloží se nová konverzace (tj. přeskočí se body 3a a 3b), ale pokračuje se v existující na základě daného ID (bod 4).
  8. Repeat. Profit.

Nebo mi něco uniká?

Jan Mikeš
Člen | 771
+
0
-

Ja to naprosto chapu a zda se mi to vporadku :)

hAssassin
Člen | 293
+
0
-

@Majkl578: nene, neunika ti nic, a je to takto v poradku. pokud je v session ulozeno primo ID konverzace z tabulky z DB pak je to asi nejjednodussi reseni. Ja mel na mysli, pokud ta konverzace je ulozena pod nejakym klicem, tak jak ten klic nejlip vygenerovat aby byl skutecne unikatni.

@enumag: hezky, o tyhle funkci sem nevedel :)