2015-05-27 13 views
13

Sto sviluppando uno script di analisi che le persone saranno in grado di aggiungere alla propria pagina per tenere traccia dei dati dei visitatori. Uno dei problemi che ho riscontrato è quello di mettere a punto un modo per tenere traccia delle sessioni individuali quando visualizzano la pagina di qualcuno da un browser privato (ad esempio Incognito).Ricordando la sessione PHP Navigazione privata

Questo è lo script che sto utilizzando per vedere se qualcuno osserva se qualcuno è attivo da più di 30 minuti, se lo ha, verrà creata una nuova sessione, in caso contrario, riprenderanno la sessione precedente .

 session_start(); 
     $max_time = 1800; 
     $current = time(); 
     if (!isset ($_SESSION['Stationary'])){ 
      $_SESSION['Stationary'] = time(); 
      $session = $_SESSION['Stationary']; 
     } 
     if (!isset ($_SESSION['Inactive'])) { 
      $_SESSION['Inactive'] = time(); 
     } else { 
      $session_life = $current - $_SESSION['Inactive'] ; 
      if ($session_life > $max_time) { 
       session_destroy(); 
       session_start(); 
       $_SESSION['Inactive'] = time(); 
       $_SESSION['Stationary'] = time(); 
       $session = $_SESSION['Stationary']; 
      } else { 
       $_SESSION['Inactive'] = time(); 
       $session = $_SESSION['Stationary']; 
      } 
     } 

Questo script funziona perfettamente quando un utente visualizza la mia pagina da un normale browser (IE. Chrome Incognito), tuttavia quando lo vedono su qualcosa come un iPhone, in Navigazione anonima, ogni volta che accedono ad una nuova pagina , viene visualizzata una nuova sessione, un problema che non ho quando viene visualizzato diversamente.

Quindi la mia domanda è, sono consapevole che la visualizzazione delle pagine in un browser privato si ottiene attraverso il cache temporaneo che viene cancellato una volta che il browser è chiuso, tuttavia perché è anche quando il browser non è chiuso, aprendo un link distrugge la loro sessione precedente anche quando il link porta a un'altra pagina, con lo stesso script sulla pagina?

Esiste una soluzione alternativa?

EDIT: Vorrei sottolineare che questo script è stato inserito in un file php con l'intestazione application/json per essere utilizzato come file pure un JavaScript.

+1

A proposito, è possibile configurare la durata delle sessioni tramite 'session.gc_maxlifetime'. –

+0

My WebHost non consente di gestire il file di configurazione php purtroppo, @ Ja͢ck – Brad

+1

Puoi impostarlo con 'ini_set()' (a causa di PHP_INI_ALL), quindi non ci dovrebbero essere problemi lì. –

risposta

9

Se in primo luogo guardiamo php session documentation

Un visitatore accede al vostro sito web viene assegnato un ID univoco, il cosiddetto ID di sessione. Questo è memorizzato in un cookie sul lato utente o è propagato nell'URL.

In secondo luogo, ciò che mozilla support dice di navigazione privata (praticamente la stessa per gli altri browser)

Cosa navigazione privata non salva? Biscotti!

Quindi la risposta è chiara subito: il browser non è salvare le di cookie che vengono utilizzati da php al fine di recuperare la rispettiva sessione.

Esiste una soluzione alternativa?

. La variabile $_SERVER contiene dati che possono essere considerati come univoci. Ad esempio, provare a utilizzare REMOTE_ADDR combinato con dati analizzati da HTTP_USER_AGENT e CRUD (database, probabilmente).

qualche informazione in più

+0

Sono in grado di rimanere connesso a un sito Web durante la navigazione privata, mentre navigo tra le pagine senza chiudere la scheda, questo non funziona quando implementando uno script come questo, potrebbe essere perché non sto usando questo script come un "include" su tutte le pagine ?; Anche questo script funziona alla perfezione mentre si naviga in privato su un browser privato su google chrome desktop, tuttavia lo stesso non si può dire per la navigazione privata di safari su iPhone. – Brad

+0

Vedere la domanda correlata qui: http://superuser.com/questions/601819/why-chrome-incognito-keeps-cookies-after-closing-browser. Sembra che i vecchi cookie siano mantenuti permettendo così di avere la stessa UX. Cosa intendi per inclusione in tutte le pagine? Se non ci sono Front Controller (un punto centrale, proxy simile) per le richieste allora - sì, dovresti farlo, altrimenti mettilo lì. – sitilge

+0

Come detto nel tuo secondo link (quello che si collega al "get client IP address"), $ _SERVER non ha sempre le giuste informazioni sull'IP. Quindi, se il visitatore è dietro un proxy e questo proxy non invia HTTP_X_FORWARDED_FOR non avrai mai informazioni corrette. La navigazione privata è ciò che ha detto, è privata, cercando di non dire nulla sull'utente. Forse non è perfetto, ma non si può fare affidamento sul proxy per aggirare. – Armage

1

Purtroppo, non posso commentare, quindi sto solo postando questo link qui:

https://panopticlick.eff.org

On questo sito puoi vedere tutte le informazioni che è trapelato dal tuo browser. Stanno usando Javascript per alcuni dati, ma questo non dovrebbe essere un problema visto che la maggior parte degli utenti ha comunque abilitato Javascript.

2

Questo è possibile ottenere se si utilizzano ETags. C'è un articolo qui che descrive come funziona:

http://lucb1e.com/rp/cookielesscookies/

ETags sono persistenti attraverso il browser in incognito sessioni - tuttavia è necessario aggiornare continuamente la sessione in quanto può essere persa quando si chiude la finestra e riaprirlo.

Vorrei aggiungere che ci sono enigmi etnici con questo (ma non ho alcuna fonte).