A opět jsem tu se session :-) Nějak jsme se v mnoha předchozích diskusích nedobrali závěru jedné části tohoto tématu, a tak bych se rád zeptal na vaše názory.
Na jedněch stránká používám session a jelikož to nepotřebuji nějak extra chránit, přenáším jen id a čas vypršení platnosti, tudíž vůbec nepotřebuju databázi.
Chtěl jsem ale v jedné aplikaci zlepšit bezpečnost. Rád bych se tedy zeptal, jak co nejlépe na to. Nastíním tu svůj postup a rád bych vaše názory na něj.
Používal bych již databázi a v ní měl uložený login, vygenerované ID, čas vypršení platnosti a dále IP adresu.
V session bych pak přenášel login a ID a login. Při kontrole bych pak porovnával login, ID a IP.
A zde jsou ještě dotazy:
Vyskytne se někdy situace, že by se mohla uživateli v průběhu změnit adresa?
Lukasik tu kdysi psal, že to všechno protáhne MD5. Je tedy lepší ten login a ID přenášet zahashovaný v MD5?
Jaký další kontrolní mechanismus by setu dal ještě zavést?
Dík za vaše názory a nápady.
neni to cely zbytecny?
na tu db mas vlastni session_handler?
jeslti session vzdy pri odlogovani zanika (coz je myslim docela rozumne reseni) tak nema zadnou cenu prenaset login..
dobrej napad je ta kontrola ip adresy - asi bych ji na jejim zaklade primo tvoril sid (napriklad md5 z ip+http_x_forwarded_for+nejake nahodne cislo) a pak tu kontrolu rovnou zabudoval do session_handleru, cas vyprseni myslim take neni nutny - session se kazdopadne zrusi po vyprseni 180min..
To je jasné, že po odlogování zruším session. Co se týče vypršení, tak 180 min je moc, tak proto. Jinak Tím, že přenáším login atd. jsem myslel, že to zakomponuji do sid (tj. md5 z ip+login+id - náhodné číslo). Dík ale, pomohl jsi mi si to srovnat v hlavě. Teď se ještě mrknu, co to je http_x_forwarded_for a jdu se do toho pustit. Dík.
Mno, došel jsem k řešení, které je podle mě nejúspornější a přitom se snaží být nejvíce bezpečné.
Tak tedy jako SID budu přenášet nějaké náhodně generované číslo. To se vytvoří při přihlášení a zároveň se uloží do databáze, spolu s IP.
Toť vše, pro vlastní další potřebu si tam ještě uložím login a čas vypršení platnosti, ale to už přímo nesouvisí s daným problémem.
A nyní můj rozbor, proč to nelze vylepšit.
Když to někdo zachytí, tak se bude moct dostat na server pouze po dobu, co bude ten uživatel přihlášen a ještě bude muset být za stejnou proxynou. Přiště bude opět namydlenej, jelikož po odhlášení toho uživatele se to vymaže z databáze a příště se vygeneruje zase jiné id.
Při každé kontrole přístupu mrknu do databáze, jestli tam je uživatel s daným id a jestli má stejnou IP. Pokud ne, tak zamítnu přístup. Nevidím tedy důvod, proč dělat věci jako zahashovat to celý md5 apod.
Ještě dotaz. Co to je: http_x_forwarded_for
zahashovat ip do sid ma tu vyhodu ze to pak nemusis davat do db.. (jestli ji tam stejne mas tak je to jedno ;)
jinak bacha s tou ip - nekteri provideri meni ip adresu i behem session, coz celou tuhle metodutak trochu znehodnocuje .. i kdyz - pouziva se to na tolika strankach ze bych rek ze si uz jejich uzivatele zvykli na to ze jsou diskriminovany :-)
$_SERVER['HTTP_X_FORWARDET_FOR'] je promenna kam se uklada forwardovana ip adresa z http hlavicky - ne ze by se tomu dalo verit ale muzes tak odlisit uzivatele za stejnou proxynou
Tak jsem nad Tím ještě podumal. Mám v tom trochu zmatek a nedaří se mi si to v hlavě srovnat. Ponořil jsem se ale do manuálu a zjistil jsem, že jsem žil v mylné představě. Nicméně už je mi to asi jasné. Tím jsem také došel k tomu, že databázi již není třeba používat, neboť to byl vlastně duplicitní session handler. Díky Ti za trpělivost s pomalým chodem mého mozku, ale snad už je mi to jasný.
dík za $_SERVER['HTTP_X_FORWARDET_FOR'] , myslel jsem si, že to bude něco takovýho
S tou změnou IP během session to je blbý. Pokusím se zjistit, jak to bude běhat a uvidím.
Dík ještě jednou.
Ještě mi ale něco uniká. Když vytvořím SID v md5 z IP a náhodného čísla, při kontrole přístupu session handler zkontroluje exitenci ID. Nevím ale, jak já budu moci využít tu IP, když bude zahashovaná s tím náhodným číslem.
Představoval jsem si, že při kontrole porovnám získanou IP s tou v SID, ale jak to mám porovnat, když nebudu znát to nahodné číslo a nebudu to moct spolu zahashovat?
to je fakt, no :-)
myslel jsem to jako md5 z ip + nahodny cislo (md5($ip).rand()) a pak z toho extrahovat pokazdy tech 128 bitu
Tak jsem nad tim znovu dumal, a zjistil jsem, ze je to vsechno blbost.
ID se muze nachat standardni a ty ostatni veci jednoduse ulozim do session promenne a nemusim to ani hazet do md5, jelikoz stejne zustavaji na servru, takze je nikdo neziska (nebo to muzu nechat projit md5, kdybych byl moc paranoidni, protoze preci jen by je ziskat mohl).
Kdyz se pak nekdo pokusi o pristup, tak mrknu, jestli ma nastavene patricne promenne a dale jestli odpovidaji skutecnosti (ip atd.) a je to.
Vse ostatni by bylo duplicitni tvoreni session handleru a nebo zbytecne komplikovane vytvareni sid, ktere ma stejne jen funkci vztazeni konkretniho uzivatele k zaznamu v databazi a neda se na nem vymyslet nic bezpecnejsiho, jelikoz je fuk, jestli je to nahodne vygenerovany, nebo slozite vytvoreny.
Pokud nekdo zachyti sid a podstrci ho, tak to bude fungovat pouze do doby, dokud bude on-line i ten druhy uzivatel a taky pokud budou mit stejnou ip (pri zapnute kontrole ip).
Vic se to zabezpecit neda a stejne to ani nema cenu, jelikoz kdyby nekdo neco zachytil, tak zachyti heslo zadavane na zacatku a posilane v hlavicce, jelikoz to je asi to nejjednodussi. Takze pomuze akorat SSL :-)