Napredna prijava z "Remember Me"
7 naročnikov
7 naročnikov
Dober dan,
Mene zanima ena stvar, in sicer poskušam nardit zelo varno prijavo z možnostjo "Remember me" torej sestava je takšna:
Po prijavi usvtarim sejo z informacijami o uporabniku (ID uporabnika (random generiran ali pa Facebook account id), temporary ključ (popovnoma random z trenutnim časom in ip naslovom uporabnika, seveda enskriptan z base64 in pa ključem, hkrati pa ustvarim tudi cookie z informacijo temporary ključa. Torej če uporabnik ne označi "Remember me" bo po potečeni seji (po zaprtju browserja) ta potekla. V bazi pa je ta seja omejena na en dan. Če je pa "Remember me" označen pa se shrani v bazi podatek da je potek seje čez 30 dni, in pa ko uporabnik pride nazaj, brez seje se zgodi naslednje:
Preverim cookie, če je key enak kod v bazi, ustvarim nov temporary key z expiracijo iz baze (torej še 29 dni) in tudi shranim nov temporary key v cookie.
Samo zanima me ena zadeva, glede na to da se da cookie ukrast, kakšna je možnost za to? Se da kako zaščitit da bi recimo v bazo shranil nekaj unikatnega za vsakega uporabnika? In pa prenašam vse skupaj prek HTTPS če je le možno. Problem pa nastane ko uporabnik pride po potečeni seji, ker ne glede na protokol se ponovno ustvari cookie z novim "keyom" ki pa ni prenešen preku https protokola, je to velika luknja v varnosti?
Če želite več lahko tudi postam kodo. Samo da rešim tole, ker rabim res varno prijavo tudi za kasneje.
LP.
Jaka.
16 odgovorov
Najbolj varno je kot je bilo že omenjeno prenos kukijev preko SSL povezave. Če hočeš stvar dodatno zavarovati ... shranjuj državo logina, ISP.
V primeru, da nek login vedno prihaja iz Avstrije in nato iz Kitajske pač zablokiraš zadevo in pošlješ aktivacijsko kodo na email. Odvisno kolk secure hočeš biti :D
MAC je brezveze, ker če boš imel server za ruterom boš dobival MAC ruterja :D
Ne, ne in še enkrat ne! Pozabi MAC naslov, pozabi ime računalnika. Če hočeš zelo varen login se zgleduj recimo po NLB kliku. Imej SSL, magar kakšno dodatno geslo, ampak ne zanašaj se na podatke, ki se jih da sfejkat (MAC, user agent, ime računalnika, ...)
EDIT: poleg tega se MACa ne da dobit izven LANa.
Hvala zelo zelo so mi ti komentarji razširili pogled.
Najbol se mi pa dopade ideja, da še polek vsega primerjaš ISP-ja recimo. To se da pridobit ali pa drzavo kar je lažje. Sicer ni ravno nek zelo dober podatek ker pri kitajcih je to miljarda ampak za europo pa že ^^.
No kakor koli ostajam pri cookie + tmp key + baza. Za enkrat. Bom pa spremenil in odstranil bazo ker je res samo v napotu. Ker v primeru da pride uporabnik po potečeni seji se nov cookie prenese prek HTTP ki pa ni varen.
Me pa zanima zakaj je PHPBB napisan v smeri baze, ker namreč tam sem dobil idejo za ponovno avtorizacijo preku baze podatkov. PHPBB ma nek key za vsakega uporabnika pa sejo, podobno kod jaz ampak nekako tricky xD.
Kakor koli ! Se zahvaljujem, če bo pa še kaj novega pa kar na plano !
P.S.: Ime računalnika pridobiš z : "gethostbyaddr" ki pa dajansko ne odvrne ime pcja, ampak reverse IP ime. Kar pa je tudi kar dobra zadeva ker recimo na dinamičnih ip-jih vsi ISP-ji imajo reverse dns ime unikatno, nevem pa ali ostane z uporabnikom ali se enako spreminja kod ipji. Torej če je reverse name vedno enak na različnih IP naslovih je potem to dokaj dobra zadevca =)
Reverse dns se vedno zamenja na dinamičnem IPju .. pač vezan je na svoj dinamičen IP. Nesmiselno bi bilo, da imaš dinamičen IP in stalni reverse na tvoje dinamične ipje.
Za to obstajajo servisi kot so DynDNS in podobni, kjer z uporabo njihovega servisa pridobiš domeno, ki kaže na tvoj vedno spreminjajoč IP. Seveda rabiš za to ustrezno nastavit router, ali aplikacijo na računalniku.
Sorri za offtopic :)
Heh, NB =). Ja sem potem malo pomislil ja pa sem prišel do zaključka da reverse dns je glih tak vezan na IP. Tako da na koncu koncev z php nimaš dobene možnosti dobit nič unikatnega in varnega od uporabnika :).
Torej Cookie + PHP Seje pa gremo !
Hvala za nasvete !
Kot sem rekel glej države. Na koncu je pa od uporabnika odvisno, kako dobro zavaruje in hrani svojo geslo :)