2011-11-01 4 views
19

Ho problemi con la mia applicazione CakePHP. Questo sembra accadere solo in IE e solo su alcuni computer. È coerente sui computer dove sta accadendo però.CakePHP Cookie/Problemi di sessione

Problema uno: utente è collegato e nella pagina https://example.com/users/view e scatti firmare fuori. L'utente viene reindirizzato a http://example.com e sembra essere disconnesso fino a quando l'utente visita un'altra pagina https e sono ancora connessi. Possono fare clic su Esci tutte le volte che vogliono, ma sono sempre connessi su https e si disconnettono solo su http.

Problema due: utente si collega al https://example.com/users/signin vengono reindirizzati a http://example.com e ora sembrano essere loggato per l'utente va a https://example.com/admin/slides e non lo sa ancora, ma ora è disconnesso, cliccando su qualsiasi altra pagina (. o semplicemente aggiornando la loro pagina corrente) chiederà loro di accedere di nuovo.

Non ho idea di cosa sta succedendo. Ho letto e provato le soluzioni descritte su entrambi questi problemi simili: Session not saving when moving from ssl to non-ssl e Cookie not renewing/overwriting in IE ma ho ancora gli stessi problemi.

L'unico indizio che ho notato finora, (e non so se questo significa qualcosa) è quando il debug sia $_SESSION e $this->Session->read() sulle pagine HTTP SEMPRE solo $ this-> session-> read() restituisce un valore. sulle pagine HTTPS alcuni SEMPRE restituiscono lo stesso valore per entrambi, gli altri SEMPRE restituiscono solo un valore per $ this-> Session-> read().

Ad esempio, http://example.com e https://example.com/users non vede mai $ _SESSION, https://example.com/carts vede sempre $ _SESSION. Non sono sicuro, ma penso che forse le pagine sicure dovrebbero vederlo e dato che alcuni non possono forse qualcosa non va, tuttavia quando scruto il codice non vedo alcuna differenza che possa suggerire il motivo per cui uno fa e l'altro no. t.

Inoltre, se aggiungo $this->Session->destroy() a beforeFilter in AppController, tutte le pagine anche HTTP possono vedere $ _SESSION. In realtà non sto usando $ _SESSION nella mia applicazione, ho solo pensato che questo potrebbe essere un indizio di cosa non va.


UPDATE

ho tooked consiglio di Gustav Bertram e guardò la stringa user agent. Ho confrontato la stringa dell'agente utente con IE su un computer che stava riscontrando il problema con IE su un computer che non presentava il problema. Erano gli stessi eccetto quello che stava avendo problemi ha "google chrome frame" nella stringa user-agent. Ho disinstallato Google Chrome Frame da quel computer, riavviato, riprovato e il problema sembrava risolto.

Se questa è la vera causa, la soluzione più semplice sarebbe fare in modo che gli utenti disinstallino Chrome frame. Tuttavia mi chiedo se ci sia un lavoro in giro che consentirebbe loro di avere il telaio cromato installato e ancora funzionante.

+0

(presumo che tu abbia eliminato i soliti sospetti di memorizzazione nella cache.) Quali versioni di IE? Il bricolage con le intestazioni di pagina (controllo della cache, ecc. - vedere http://support.microsoft.com/kb/234067) ha qualche impatto? – OpenSorceress

+0

Il contenuto della sessione è codificato o qualcosa del genere? Potrebbero essere opzioni di sicurezza .. – Dunhamzzz

+0

La pagina ha contenuti flash? Hai provato a cambiare la sicurezza della sessione da HIGH a LOW? – binoy

risposta

16

Prova ad aggiungere il seguente al file core.php:

Configure::write('Session.checkAgent', false); 
Configure::write('Session.ini',array('session.cookie_secure' => false, 'session.referer_check' => false)); 

Questi parametri devono forzare il cookie a persistere anche attraverso Google Chrome Frame. Questo imposterà le impostazioni di PHP e CakePHP per consentire ai cookie di persistere su http e https.

+0

Ho pensato che questi sono i parametri di CakePHP 2.0. Possono essere leggermente diversi in 1.3, ma dovrebbero permetterti di navigare tra http e https mentre sei loggato. –

+0

Sembra la stessa sintassi della 1.3, ha funzionato in 1.3 senza errori. :) Questo sembra risolvere il problema anche quando è installato il frame di Chrome. Sai perché Cake stava controllando l'agente, in primo luogo? Scusate, ho già dato via la taglia che stava per finire quando l'ho fatto. –

+0

È una misura di sicurezza. Penso che per impostazione predefinita, desideri che un cookie sicuro sia valido solo in una connessione sicura. Se vai su http, non è più sicuro. Quindi, qui, fondamentalmente lo stiamo spegnendo. Nessun problema per la taglia. Sono contento che tu abbia funzionato! –

6

Il mio suggerimento è di dare direttamente un'occhiata ai pacchetti, per vedere cosa sta succedendo ai cookie.

Installare Wireshark sul computer client e connettersi a un server Web remoto. (Wireshark ignorerà il traffico localhost.)

Il mio sospetto è che i cookie si stiano corrompendo (una volta avevo alcuni cookie storpiati da PHP!) o sono bloccati (che sarebbe colpa di IE). Ad ogni modo, avrai più informazioni su cosa sta andando storto.

Come ultima risorsa, controllare la stringa user-agent nel codice per la versione incriminata/non supportata di IE e invitare le persone a effettuare l'aggiornamento.

+0

Ti sto assegnando la taglia dal tuo suggerimento di guardare l'agente utente è ciò che mi ha portato a trovare il problema della cornice cromata. Mi piacerebbe ancora capire un modo per farlo funzionare con frame cromato installato però. –

+0

A quanto pare puoi inserire un tag [forzare IE con Google Chrome per utilizzare il motore di rendering di Chrome] (http://www.zdnet.com/blog/google/google-chrome-frame-hijacks-ie-and-is- ormai considerato stabile/2485). Se ciò non ti dà gioia, potrebbe essere il momento della segnalazione bug. –

-1

Ti sei assicurato di non avere spazi o nuove righe dopo aver chiuso php?> Tag? Forse è stata la prima cosa che hai controllato, ma per esperienza so che i tag php male chiusi causano problemi sporadici con la gestione delle sessioni di php.

0

Prova a mettere questo in beforeFilter del tuo AppController e vedere se fa qualcosa. Ho la sensazione che le impostazioni dei cookie non siano configurate come se fosse necessario. See here per maggiori informazioni.

function beforeFilter() { 
    $this->Cookie->domain = '.example.com'; 
    $this->Cookie->secure = false; 
}