2010-05-06 2 views
5

Ecco lo scenario:Quali sono alcuni modi per identificare un utente che ha effettuato l'accesso sul Web?

Ci sono 5 siti Web (nomi di dominio diversi) che devono condividere una sessione. Sto usando un po 'di codice su ogni sito che restituisce un'immagine "blank.gif" e allo stesso tempo imposta la sessione (sincronizzandola con la sessione corrente). Ciascuno dei siti chiama un img di sessione da ciascuno degli altri siti. Inoltre, tutti i siti hanno accesso allo stesso database (in cui è archiviata la sessione). Funziona alla grande su FF e Chrome, ma non su IE (o Safari PC) ...

Ho bisogno di trovare un metodo alternativo per mantenere attiva una sessione? L'app è un piccolo CMS personalizzato, quindi solo 2-3 persone lo useranno.

Probabilmente posso identificare gli accessi degli utenti da IP e poi continuare a verificare la IP preferito su tutti i siti ...

c'è qualcosa di più granulare, ad esempio un uuid computer che posso controllare?

+5

Se è la stessa sessione, perché non solo di trasferire l'ID di sessione come un parametro GET quando l'utente si sposta da una pagina all'altra? – Daff

+0

no, non c'è niente come "uuid di un computer". –

+0

Daff, mal provarlo, devo solo avere un parametro nell'URL quando l'utente admin ha effettuato l'accesso ... – farinspace

risposta

1

Se è la stessa sessione, perché non basta trasferire l'ID di sessione come parametro GET quando l'utente si sposta da una pagina all'altra? - @Daff

@Daff, se si aggiunge la risposta qui, io modifico e selezionarlo come la risposta

-2

È possibile sovrascrivere il gestore di sessione per fare in modo che salvi i dati di sessione in un database condiviso dai diversi siti Web. Quindi, dovresti impostare un cookie di sessione con lo stesso ID di sessione su ciascun server. Dovreste usare session_set_save_handler e fare qualcosa di simile:

/** 
* @desc function used to open sessions 
* @param string session path 
* @param string session id 
* @return bool 
*/ 
function xx_session_open($path, $id){ 
    return true; 
} 

/** 
* @desc used when closing a session 
* @return bool 
*/ 
function xx_session_close(){ 
    return true; 
} 

/** 
* @desc saves session data 
* @param string session id 
* @param string session data 
* @uses xx_crypt 
* @return bool 
* @global object PDO instance 
*/ 

function xx_session_write($id, $data){ 
    global $db; 
    $crypted = xx_crypt($data); 
    // Saves data into db 
    $sql = 'REPLACE INTO sessions (`ID`, `data`, `lastUsed`, `IV`) VALUES(:id, :data, NOW(), :iv)'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id, ':data'=>$crypted[0], ':iv'=>$crypted[1])); 
    return true; 
} 

/** 
* @desc gets session data 
* @param string session ID 
* @return string 
* @global object PDO instance 
* @uses xx_decrypt 
*/ 
function xx_session_read($id){ 
    global $db; 
    $sql = 'SELECT `data`, `IV` FROM sessions WHERE `ID`=:id'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id)); 
    list($crypted, $iv) = $sth->fetch(); 
    $data = xx_decrypt($crypted, $iv); 
    return $data; 
} 

/** 
* @desc destroys a session 
* @param string session ID 
* @return bool 
* @global object PDO instance 
*/ 
function xx_session_destroy($id){ 
    global $db; 
    $sql = 'DELETE FROM sessions WHERE `ID`=:id'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':id'=>$id)); 
    return true; 
} 

/** 
* @desc delete old sessions 
* @param int session lifetime (in seconds) 
* @return bool 
* @global object PDO instance 
*/ 
function xx_session_gc($lifetime){ 
    global $db; 
    $sql = 'DELETE FROM sessions WHERE `lastUsed` < :limit'; 
    $sth = $db->prepare($sql); 
    $sth->execute(array(':limit'=>date('Y-m-d H:i:s',time() - $lifetime))); 
    return true; 
} 

// Set session handler 
session_set_save_handler("xx_session_open", "xx_session_close", "xx_session_read", "xx_session_write", "xx_session_destroy", "xx_session_gc"); 

Se quello che cercate è un meccanismo di Single Sign On, si potrebbe verificare il protocollo Kerberos che è fatto per questo.

+0

questo è praticamente quello che sto facendo già ... il problema che sto avendo è passare la sessione ai nuovi domini, stavo cercando un passaggio di immagine nascosta per tutti i diversi siti, ma non funziona in IE8 per essere esatto – farinspace

+0

Quindi, il il modo più semplice per farlo è quello che stai già facendo con la tua immagine: ogni volta che generi un id di sessione, devi generare una pagina web che chiama lo script di altri domini con l'ID di sessione come parametro per consentire a quegli script di generare i loro cookie di sessione con il giusto id. – Arkh

2

Qualsiasi cosa che renderebbe questo possibile senza la collaborazione degli utenti sarebbe un bug per quanto riguarda la privacy degli utenti e l'anonimato che potrebbe essere risolto. I siti web non sono considerati per essere in grado di scoprire a quali altri siti è stato un utente e cosa ha fatto lì.

+1

Dillo a Facebook !!! – Pierreten

+0

In effetti, informalo a chiunque usi google analytics o adsense o qualsiasi altro plug-in incorporato. – Arkh