Modifiche ai dati di session PHP in Internet Explorer

Ho definito una session per l'archiviazione di token utilizzando PHP come di seguito:

$_SESSION['token'] = sha1(uniqid(mt_rand(), true)); 

quando voglio leggere questa session, non ho alcun problema in Chrome o Firefox. Ma in IE, cambia in qualcos'altro prima di rigenerarsi. Ad esempio se memorizzo il suo valore in un field nascosto del module e lo invio in questo modo:

 <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" /> 

Otterrò questo risultato in IE nella prossima pagina:

 echo $_SESSION['token']; // shows 1b05fab5ec11f1d50713aea6e74f84727d29b4a3 echo $_POST['token']; // shows e8fac6d55b04d1752f37ecde953f7f08b112ccca 

Mentre se $_SESSION['token'] subito dopo la creazione o anche alla fine della sua pagina di creazione, mostra il contenuto esattamente e senza problemi.

A cosa serve questo problema?

Modificare:
Questa è la mia forma:

 <form action="process/login.php" method="post"> <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" /> <label>Email: </label><input type="text" name="email" /> <div class="space"></div> <label>Password: </label><input type="password" name="password" /> <div class="space"></div> <input type="submit" value="Login" class="button" /> </form> 

Dato che PHP e lo storage di session sono lato server e IE è ovviamente un client, il problema non risiede nel codice di session.

Di solito le sessioni vengono tenute traccia di un cookie (cookie di session) o di una variabile POST / GET. Di default in PHP questo valore è chiamato PHPSESSID.

Probabilmente, nel tuo caso il cookie di session o la variabile POST / GET che è collegata alla tua session lato server non viene considerata valida in IE. Nel caso di un cookie, potrebbe avere a che fare con le impostazioni dei cookie e se i cookie sono consentiti o less. Nel caso di un POST / GET potrebbe essere che il tuo HTML sia malformato in un modo che non piace a IE, ma altri browser lo capiscono.

Ora, una volta perso questo valore in IE, PHP assegna a quel browser una nuova session per each richiesta e il token di session viene rigenerato a each richiesta. Ma il tuo field nascosto ricorda anche il vecchio token …

Se ci mostri più codice (puoi modificare la tua domanda), posso modificare la mia risposta per fornirti maggiori dettagli.

modifica Puoi iniziare mostrandoci le linee di impostazioni php.ini rilevanti che riguardano sessioni e cookie di session. E ricontrollando le impostazioni dei cookie di IE. In particolare vorrei sapere se hai impostato un path cookie, rendendo i cookie disponibili solo nella stessa directory.

Forse hai persino un'impostazione di sicurezza IE o un componente aggiuntivo installato che impedisce i cookie. Quindi prova a controllare le impostazioni di IE e disabilitare tutti i componenti aggiuntivi e testarlo di nuovo.

Controlla anche se la prima pagina (che imposta la session) e la seconda pagina (che legge la session) hanno ESATTAMENTE lo stesso nome di dominio.

Ad esempio, www.yourdomain.com nella prima pagina, non dovrebbe essere yourdomain.com nella seconda pagina (senza www) o www.yourdomain.com. (con un punto in più alla fine).

Penso che dopo aver inviato il tuo module potresti aver creato un altro valore di token.

uso

 if(!isset($_POST['token'])){ $_SESSION['token'] = sha1(uniqid(mt_rand(), true)); } 

Proverei a cambiare il nome dell'input in qualcos'altro, forse IE sta facendo cose strane con il nome del token. Ho cercato la networking, ma nulla menziona questo, ma solo per essere al sicuro, e rimuovere questa opzione lo farei.

 <input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" /> 

a:

 <input type="hidden" name="my_session_token" value="<?php echo $_SESSION['token']; ?>" /> 

E prova a cambiare $_SESSION['token'] in $_SESSION['my_session_token'] come detto sopra in un commento

Sono quasi certo che stai assegnando $_SESSION['token'] due volte. Potrebbe essere la stessa row di codice eseguita due volte o anche tu hai assegnato la variabile da qualche altra parte. Per trovare il problema è necessario definire una function come wrapper per l'assegnazione della voce della session. Quindi chiama la function invece di assegnare direttamente la variabile. Ecco il codice di esempio:

 function assign_token() { $_SESSION['token'] = sha1(uniqid(mt_rand(), true)); } 

Ma devi assicurarti di non assegnare mai il token direttamente in nessun punto del tuo codice. E chiama invece questa function. Una volta che hai fatto questo, se hai un debugger, tutto ciò che devi fare è impostare un punto di interruzione all'interno di questa function e vedere quante volte è chiamato e da where.

Ma nel caso in cui non si abbia un debugger installato, o peggio ancora, nel caso in cui l'assegnazione avvenga non all'interno di una singola richiesta ma in due, è necessario modificare la propria function in questo modo:

 function assign_token() { file_put_contents('/tmp/assign_token.txt', time() ."\n". print_r(debug_backtrace(), true), FILE_APPEND); $_SESSION['token'] = sha1(uniqid(mt_rand(), true)); } 

La linea aggiunta ti aiuterà a tenere traccia di each volta che la function viene chiamata. Anche se è chiamato due volte in due richieste separate, puoi identificarle grazie a FILE_APPEND e time() . Il primo si aggiunge al file (ovviamente) in modo che le voci di registro non si sovrascrivano a vicenda e la seconda aiuta a sapere se due voci del registro sono eseguite nella stessa richiesta.

Questo è tutto ciò che ho. Alla fine, potresti voler modellare le voci del registro rendendole più leggibili.

Farei qualcosa di più sulla falsarow di questo:

 md5(uniqid($_SERVER['REMOTE_ADDR'], true)) 

Garantire che il token sarà sempre unico.

Correggimi se ho torto ma ho già testato il codice qui sotto in Chrome FF e IE 7 e non sembra che ci sia alcun problema con IE.

 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form method="POST" action="/"> <?php session_start(); if(!$_SESSION['token']){ $_SESSION['token'] = sha1(uniqid(mt_rand(), true)); } ?> <input type="hidden" value="<?php echo $_SESSION['token']; ?>" name="token"/> <button type="submit" name="send">Send</button> <?php if(!empty($_POST)){ var_dump($_POST); var_dump($_SESSION['token']); } ?> </form> </body> </html> 

Se hai la versione php> = 5.4 prova a impostare il server integrato in php con questo command ():

 php -S localhost:88 -t /path/to/your/app 

Supponiamo che tu stia testando sul tuo computer locale. Forse qualcosa non va con lo stack apache + php sul tuo server.

Controlla il valore di sha1 (uniqid (mt_rand (), true)) . IE ha problemi con i nomi che contengono '-' o '_' – non possono mantenere una session! Ho avuto questo problema due volte in passato, e mi ci vogliono sempre settimane per capire, e sono scioccato che IE non l'abbia risolto.

Assicurati di non avere questi personaggi!