2014-06-11 13 views
5

Attualmente sto sviluppando un'applicazione in cui devo proteggere poche pagine utilizzando SSL. Ad esempio, Accedi, registra le pagine. Tuttavia, quando il protocollo passa da https a http, la sessione di Laravel non viene trasmessa su HTTP.La sessione di laravel non funziona quando si cambia protocollo (https a http o http a https)

c'è qualche soluzione, Laravel manterrà la sessione per entrambi i protocolli.

+1

In app/config/session.php 'secure' => false '? L'hai modificato? –

+0

Il mio file di configurazione non ha nulla di simile. Tuttavia, ci proverò. – Anam

+0

@pleasedeleteme non funziona. – Anam

risposta

3

Per impostazione predefinita, Laravel imposta secure e/o httponly per i cookie di autenticazione e di sessione. Non riuscivo a trovare un modo per cambiare questo nella configurazione, e infatti in laravel 4,0 (questo non è più il caso), il HttpOnly è difficile codificato come un ambiente in vendor/laravel/framework/src/Illuminate/Session/SessionManager.php

Nota che non si deve perdere i cookie da Da HTTPS a HTTP, perché ti impedisce di mantenere le sessioni sicure (potrei comunque annusare una sessione da un altro utente sulla mia rete che ha effettuato l'accesso al tuo sito Web, ad esempio).

laravel 4.1+

Modifica app/config/session.php. Modificare la chiave 'secure' su false se si desidera che i cookie impostati su https vengano letti anche su http.

In alternativa, seguire il consiglio di @ martinstoeckli e impostare la chiave in base al valore dell'ambiente.

laravel 4.0

Forse il modo migliore per attuare questo sarebbe per sostituire CookieSessionHandler con il proprio gestore.

Ad esempio, è possibile creare una nuova classe che estenda CookieSessionHandler con una funzione di scrittura aggiornata che contrassegna tutti i cookie come non validi solo per https/http.

Class NewCookieSessionHandler extends CookieSessionHandler implements \SessionHandlerInterface { 
    /** 
    * {@inheritDoc} 
    */ 
    public function write($sessionId, $data) 
    { 
     // $this->cookie is \Illuminate\Cookie\CookieJar 
     $this->setCookie($this->cookie->make($sessionId, $data, $this->minutes, '/', false, false)); 
    } 

    /** 
    * Set the given cookie in the headers. 
    * 
    * @param \Symfony\Component\HttpFoundation\Cookie $cookie 
    * @return void 
    */ 
    protected function setCookie($cookie) 
    { 
     if (headers_sent()) return; 

     setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), false, false); 
    } 

} 

Poi dentro app/config/session.php è possibile modificare il driver per NewCookie

e, infine, all'interno app/start/global.php registrare il nuovo driver di cookie che sostituisce l'impostazione del biscotto

use Illuminate\Cache\Repository; 

Cookie::extend('NewCookie', function($app) 
{ 
    return new NewCookieSessionHandler; 
}); 
+0

dove metti questa classe 'NewCookieSessionHandler'? – Anam

+0

Ovunque si possa caricare una libreria/classe dovrebbe essere ok, non c'è bisogno di andare troppo vicino. Basta notare che questo è per i vecchi laravel. – timgws

3

Questo è un problema non solo con laravel . Devi decidere se il cookie contenente l'ID di sessione è limitato solo a HTTPS o se lo si invia anche a pagine HTTP.

  • Se il cookie è limitato a HTTPS pagine, non verrà inviato dal browser per richieste HTTP non sicure. In questo caso perderai la sessione quando passi alle pagine HTTP.
  • Se il cookie viene inviato a pagine HTTPS e HTTP, un utente malintenzionato può leggere l'id di sessione e quindi impersonare l'utente, quando può ascoltare una richiesta HTTP. Il cookie verrà inviato non solo con richieste html, ma anche con ogni richiesta di immagini e altre risorse.

La configurazione può essere trovato nel file \app\config\session.php e si chiama secure.Se si desidera impostare a true solo sul sito dal vivo (ma non per lo sviluppo), si potrebbe scrivere qualcosa di simile:

'secure' => App::environment('production'), 

per gestire questo problema sarebbe necessario dividere le due preoccupazioni, mantenendo la sessione e autenticazione. Ho scritto un piccolo article su questo argomento con codice di esempio. Tieni presente che quando passi da un protocollo all'altro, sei sempre soggetto a un attacco con strip SSL, quindi potresti pensare di utilizzare l'HTTPS per l'intero sito. Per i server di oggi questo non dovrebbe essere più un problema.

+0

Bel articolo Martin. – Anam

Problemi correlati