Newsgroup: it.comp.www.php
Titolo: Impedire doppio login

Vorrei creare una procedura per impedire che due utenti entrino 
contemporaneamente in un'area riservata utilizzando il medesimo account 
(username e password).
In sostanza ho una procedura che consente ad un utente dotato di 
username e password di accedere a dei contenuti riservati. Il login che 
avviene con successo provoca l'avvio di una sessione all'interno della 
quale l'utente si muove per fare quello che deve fare, e 
contemporaneamente provoca la scrittura di un cookie che funziona come 
uno di quei timbri che ti mettono sulla mano in alcune discoteche, se 
c'e' il timbro puoi entrare, se non c'e' devi fare il login.
Quando l'utente chiude il browser, o quando clicca su "logout", il 
cookie viene eliminato, la sessione viene chiusa, e l'accesso all'area 
riservata viene precluso.
Ho pensato di scrivere un micro-log nel database al momento del login, 
qualcosa tipo "username_utente, timestamp_data, ip_address_utente" 
(ovviamente non possono esserci due utenti con lo stesso username).
Per tutto il tempo che l'utente rimane nell'area riservata, il micro-log 
impedisce che un login con i medesimi dati, operato da un altro utente 
che possiede (per un motivo qualsiasi) i dati dell'utente originale, 
abbia successo: la procedura di login, semplicemente, oltre a 
controllare la validita' dei dati forniti verifica che nel db non sia 
presente un'entry con lo stesso username appena fornito; se c'e', il 
sistema rifiuta il login anche se i dati sono corretti, perche' c'e' 
gia' "dentro" qualcuno col medesimo account.
Chiarisco subito che a me non serve stabilire se il primo che e' 
arrivato a fare il login e' l'utente "giusto" o quello che ha rimediato 
in qualsiasi modo i dati dell'utente giusto.
Cliccando su "logout" il micro-log viene cancellato, e il login torna ad 
essere disponibile (di piu' non si puo' fare per discriminare utente 
"regolare" da utente clonato, ne' mi interessa farlo).
Il mio problema e' come intercettare la semplice chiusura del browser, 
senza che l'utente abbia quindi selezionato "logout", per operare la 
cancellazione del micro-log dal database.
Mi date qualche suggerimento? Uno spunto, anche per ripensare 
integralmente il mio approccio, se lo considerate sbagliato.
Spero di essere stato sufficientemente chiaro nell'esposizione dei fatti.
Grazie per l'aiuto!!! :-)
-- 
Falco Stellare - DeepVoid
www.deepvoid.it

 cancellazione del micro-log dal database.
Ovviamente non puoi :)
O meglio, non puoi mai essere sicuro al 100% che il metodo che utilizzi sia 
valido (sto pensando all'apertura di un popup quando chiude il browser. ma 
va da se che ci sono 1000 e piu' modi per impedire a un popup di aprirsi)
Di sicuro puoi solo fare questo:
Ogni volta che l'utente naviga dentro la pagina, aggiorni il timestamp nel 
db. Se l'utente rimane inattivo per un tot di tempo deve risultare 
scollegato, quindi se qualcuno dovesse entrate con lo stesso nick, devi 
controllare che l'ora corrente meno il timestamp del db sia maggiore del 
limite di tempo di inattività (diciamo 5 minuti=60*5 secondi), se così è, 
consenti il login altrimenti metti un avviso che l'utente è gia' connesso (e 
nel caso sia lo stesso utente spiegagli che deve attendere 5 minuti dovuti 
al fatto che non ha chiuso correttamente la sessione).
ciao,
Luca(riello)
 

 cancellazione del micro-log dal database.
Prova ad intercettare l'evento :
<BODY onUnload="cleanUp()">
nella funzione javascript cleanUp esegui un post su un php che elimina il
log
(dovrebbe funzionare ...)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


io uso quasi una cosa simile.
nella tabella utenti aggiungo 2 campi (logged, sessid) e ad ogni login
metto logged=1 e il session id nell'altro campo...
al logout logged=0 e sessionid=""
se mentre sta loggato su postazione A tenta il login da B..la prima
cosa che controllo è logged, se è =1 lo rimando al login oppure gli
propongo una procedura di sblocco del vecchio login e un nuovo session
id da inserire e salvare :)
penso possa andare...
speriamo ti sia di aiuto
ciao :)

 log
Uhm, effettivamente stavo pensando anche io a qualcosa del genere, 
proprio tramite onUnload pensavo di far partire un file php con dentro 
le operazioni necessarie per intervenire sul db comunicando che l'utente 
taldeitali ha effettuato una chiusura della sessione.
Benebene, mi metto a pensare :-)


 id da inserire e salvare :)
Interessante l'idea di proporgli di sbloccare il vecchio login, ci devo 
pensare su... Quello che a me interessa e' impedire l'accesso 
contemporaneo ai dati tramite un unico account; poi discriminare chi dei 
due sia l'utente legittimo e chi no, non mi interessa, anche perche' non 
credo che sia un'operazione fattibile senza rilevamenti biometrici o 
altri esotismi.
Ci devo pensare su... Grazie per il suggerimento!!! :-)


 taldeitali ha effettuato una chiusura della sessione.
Se l'utente ha il javascript disattivato? o se mentre naviga va via la luce? 
rimane connesso a vita :p
ciao,
Luca(riello) 

 Se l'utente ha il javascript disattivato?
Beh, nel sito non ci entra proprio, allora. Javascript e' richiesto 
anche per molte altre cose.
 > o se mentre naviga va via la luce? rimane connesso a vita :p
Ovviamente basta un controllo timeout, non e' questo il problema.



Lo stai provando? ce la fa a mandare dei post prima dell'unload?
ciao,
Luca(riello) 

cancellazione del micro-log dal database.
Non puoi. Caso ipotetico: gli va giu' la connessione perche' resetta
il modem; non c'e' tempo di mandare neanche un "Addio! Io muojo!". E
quando si ricollega, magari cinque secondi dopo in ADSL, ha un altro
IP e "sembra" un'altra persona, e viene buttato fuori :-)
Potresti tentare, ma e' macchinoso, con uno script javascript che in
continuazione ricarichi una GIF di un pixel per un pixel. Non occupa
molta banda (si spera), e se ti carichi pix.php?id=<RANDOM> non c'e'
cache che tenga.
Sempre che non tenga le immagini disattivate, si capisce!
Il file pix.php, richiamato ogni 5 secondi, mantiene vivo il lock su
quell'IP. Se va giu' la connessione, dopo 5 secondi il lock scade, e
non importa che browser sta usando.
Se no, brutalmente, dopo tot minuti di inattivita' gli dai la via. E
se s'addormenta alla tastiera, peggio per lui :-)
Leonardo
-- 
My county is Kiltartan Cross,
My countrymen Kiltartan's poor,
No likely end could bring them loss
Or leave them happier than before.              
http://snipurl.com/eloha