Autor Zpráva
Honca
Profil *
Chtěl bych požádat o radu.

Potřebuju zamezit přihlášení dvou uživatelů na jeden účet. Aby třeba jeden uživatel se nedokázal přihlásit se stejnými údaji přes dva prohlížeče(příklad) nebo prostě z jiných počítačů. Vím, že se to dá řešit kontrolou přes databázi, jenže ten můj způsob se mi nedaří dovést do konce.

S tím souvisí i možnost odhlášení uživatele po zavření okna prohlížeče anebo prostě, že mu najednou přestane jít internet, tak aby se odhlásil. Vím, že tu na to bylo již hodně témat, jenže nikde není to, co potřebuju. Potřebuju ve zkratce docílit toho, aby se na jeden účet mohl přihlásit jen 1 uživatel a aby když se neohlásí správně(nepoužije odkaz na odhlášení, zavře okno prohlížeče, čímž se zruší session) a bude se chtít zase přihlásit, tak aby se mohl úspěšně přihlásit a v db nebyl stále záznam o tom, že je přihlášený.

Všude v diskuzích jsou právě jen příspěvky na odhlášení přes session, ale tenhle případ se ještě nikde neřešil. 5ešení přes CRON se mi nelíbí, jde mi o tom, aby se ten uživatel mohl přihlásit v podstatě okamžitě a ne až po nějaké době. Třeba něco jako to mají udělaný Seznam nebo Centrum při přístupu k emailu.

Moc díky za rady Honza
koudi
Profil
Aby se nemoh přihlásit dvakrát uděláš tak, že si do session uložíš jeho IP (což v případě jednoho počítače nepomůže) + UserAgenta. Pak jenom porovnáváš, jestli to sedí. Pokud zavře okno a máš správně nastavený session cookie, měl by se odhlásit. Pokud jenom přejde jinam, tak to nezjistíš.
Anonymní
Profil *
ja by som to riesil cez session a sessid by som ukladal do databaze pod to konto, a ked nebude sediet sessid s tym v databazi tak ho to presmeruje na login
je vela sposobov ako modifikovat sessid napr je ho mozne menit kazdym klikom, alebo len pri zmene prehliadaca, ip.. moznosti je vela
Honca
Profil
Dobře, ale když je pro každýho uživatele session id jedinečný, tak jak to dokážu porovnat? Přece session můžu porovnávat jen na úrovni jednoho uživatele a ne mezi sebou nebo mi tu něco asi stále uniká :-)
Anonymní
Profil *
takto si vezmi ze sa neprihlasia naraz, ten kto posledny vlozi udaje do databazi v podstate ked budes mat kontrolu sessid na kazdej strane tak "vyhodi" toho starsie prihlaseneho
Honca
Profil
ja by som to riesil cez session a sessid by som ukladal do databaze pod to konto, a ked nebude sediet sessid s tym v databazi tak ho to presmeruje na login

Jenže jde zase právě o to, že když se správně neodhlásí, tak tam ten záznam v db o session id zůstane a aby se mohl znovu správně přihlásit, tak je potřeba ten požadavek zase do db poslat. Session už budou dávno vymazaný, ale ten záznam ne... o to mi právě jde :-|
Honca
Profil
takto si vezmi ze sa neprihlasia naraz, ten kto posledny vlozi udaje do databazi v podstate ked budes mat kontrolu sessid na kazdej strane tak "vyhodi" toho starsie prihlaseneho

To je dobrý řešení, má to ale podle mě jeden háček. Co když někdo zjistí údaje toho uživatele a přihlásí se pod jejím loginem a heslem(samozřejmě správnými), toho správného uživatele to vyhodí a ten "hacker" změní přihlašovací údaje. Potom se už na ten účet nepřihlásí..
Anonymní
Profil *
tak tam prihod naky cas po ktorom ten zaznam vymaze.. napr ked si vyziada stranku tak to skontroluje ci sedi id a potom ci nevyprsal cas session a ked ano tak login
Anonymní
Profil *
hehe no hacker by sa potom k jeho zaznamom dostal ci tam je alebo nie, pokial by mal heslo a pass
ale to je na dlhsiu debatu
WertriK
Profil
IMHO, sessid předávat url a ne cookie.
Potom bych kontroloval referer a pokud by neseděl s přihl. stránkou. popř jinou stránkou na servru je jasné že použil ctrl + v :)
Do db přesněji tabulky "přihlášených uživatelů" bych si ukládal jejich sessid, IP, agenta atp.
Díky tomu bych kontroloval zda sedí sessid -> pokud ne -> přihlášený dvakrát

př;

Přihlásím se a do db se zapíše 82.112.0.15 a sessid s6d5f66sd6fsds56f4sd6f
Do php přijde požadavek ze stejné IP, ale sessid je jiné -> druhé přihlášení
Do php přijde referer = např. seznam.cz -> buď použil ctrl+v -> nebo odešel ze stránky a potom se vrátil
Anonymní
Profil *
referer? neda sa nahodou odfiltrovat proxy serverom ci firewallom?
thingwath
Profil
Mohu se zeptat, proč to? Ve webové aplikaci stejně něco jako ,přihlášení` tak jako třeba do operačního systému není moc vhodné. Popřemýšlel bych o tom, jestli dělám dobrou věc.
Honca
Profil
No jasně, nejedná se samozřejmě o systém, který by měl být nějak děsně moc zabezpěčený, takže s tím hackerem to bylo jen jako příklad :-). Mně jde spíš opravdu jen o to, aby uživatel nezůstal viset při tom, že když se správně neodhlásí, např. když zavře okno třeba. Tohle nějak fakt nemůžu vymyslet..

Ale myslim, že s tím uložením session id a casu do db je to dobrý řešení. Díky moc, fakt že jo.
thingwath
Profil
Dá se to řešit nějakým tím timeoutem. To ale stále nic nemění na tom, že nejlepší je neřešit to vůbec a přihlášení tímto způsobem nezavádět.
Honca
Profil
To WertriK:

Díky za tip, to je taky dobrý způsob, víš, chtěl bych ale fakt spíš to bezpečný odhlášení, pokud uživatel zavře prohlížeč. Chápu, jak to udělat, aby se úspěšně přihlásil po zavření okna třeba po 20 minutách nebo prostě po nějakém čase, ale já bych spíš chtěl, kdyby to šlo se přihlásit hnedka a pak v průběhu práce uživatele v systému umožnit ho odhlásit právě třeba po těch 20 minutách..
Honca
Profil
Dá se to řešit nějakým tím timeoutem. To ale stále nic nemění na tom, že nejlepší je neřešit to vůbec a přihlášení tímto způsobem nezavádět.

No dobře, ale tak nevím, jak to chceš řešit, když je to přihlášení potřeba. Nejedná se o žádnou webovou stránku nebo prezentaci, ale opravdu o systém, kde je potřeba umožnit uživatelům se přihlásit ke svému účtu.
djlj
Profil
ale já bych spíš chtěl, kdyby to šlo se přihlásit hnedka
A co ti v tom brání??!
thingwath
Profil
Uvědom si, jak ta komunikace probíhá. Dá se snadno rozdělit na jednotlivé požadavky. A není problém, aby uživatel s každým tímto dotazem zaslal (použijme HTTP autentizaci) své přihlašovací údaje. Takže můžeme bez problémů identifikovat, zdali je požadavek oprávněný. Když se chce uživatel odhlásit, v praxi to může realizovat prostě tak, že zavře prohlížeč. A na serveru nepotřebujeme žádné složitosti.
Honca
Profil
to djlj:

no brani mi v tom to, že kdybych si ukládal do db sessid a cas a mel nastaveny, ze se po 5 minutach odhlasi, tak kdyz zavre prohlizec, tak ja musim tech 5 minut pockat, nez co ta doba dobehne...

to thingwath:

ja ti asi ted covece nerozumím. Chceš mi teda říct, že ty bys to řešil přes HTTP autentizaci a ne přes session, jo?
thingwath
Profil
Ano. Považuji to za lepší řešení, i když má tu (pro mě výhodu, pro někoho nevýhodu, dosaďte), že spoléhá na standardní vlastnosti prohlížeče a nemůžu/nemusím si vše bastlit sám.
ah01
Profil
thingwath Jestli jsem správně pochopil původní dotaz, tak HTTP autorizace to neřeší, stejně jsem nucen nějak zajistit jen jedno možné přihlášení.

Jinak, řek bych, že jiná možnost pro "nekorektní" odhlášení, než timeout neexistuje. Dalo by se to zlepšit přes JS, ve chvíli, kdy se pokusí uživatel zavřít prohlížeč, poslat požadavek o odhlášení, ale to nebude na 100%.
thingwath
Profil
ah01
Jedno možné přihlášení v případě HTTP autentizace nedává smysl, jak se snažím vysvětlit. Ověřuje se každý dotaz, zdali je poslán se správným jménem a heslem. Neexistuje žádné časově spojité přihlášení od do. Ověřuje se pouze oprávněnost jednotlivých dotazů a problém tak jak je nastíněn přestavá dávat smysl. Rovněž toto považuju v HTTP za řešení asi nejlepší možné.
djlj
Profil
Honca
Já myslím, že řešení ti už napsal WertriK...
thingwath
Profil
Když to bude třeba, i to omezení na jednoho uživatele se dá realizovat snadno a jednoduše pomocí HTTP autentizace. Zapamatuju si třeba IP adresu každého dotazu nebo jinou vhodnou identifikaci a po určitou dobu nedovolím další dotaz z jiného zdroje.

Nicméně stejně si nedokážu něco takového odůvodnit, proč to dělat.
Anonymní
Profil *
to djlj:

však to vím, to jsem pochopil, ale jen s tím přihlášením více uživatelů, jestli je v tom i to ošetření na bezpečný odhlášení po zavření okna, tak to v tom fakt nevidím :-)
Honca
Profil
koukám, že jsem se zapomněl přihlásit..
WertriK
Profil
Hmm, reakci na zavření okna bych řešil JS udalosti onUnload [ http://www.jakpsatweb.cz/javascript/udalosti.html ] na kterou by se vazalo otevreni noveho okna se scriptem, které by se po vykonání zavřelo.
Ale má to dost nevýhod - JS, popupokno - takže se to nemusí vůbec otevřít.

btw. Kdyř budeš sledovat ten referer tak ho potom můžeš dodatečně odhlásit a přesměrovat na login.
Toto téma je uzamčeno. Odpověď nelze zaslat.