2014-07-19 9 views
5

Sto creando moduli e non importa come lo faccio, il _token di CSRF è sempre lo stesso!Laravel 4 - Il token CSRF non cambia mai

Non importa se uso

{{ Form::open([route' => 'login']) ]] 

o se uso

{{ Form::token() }} 

E 'lo stesso ogni volta. Anche dopo aver inviato correttamente il modulo. Ho pensato che sarebbe stato consumato e ne sarebbe stato generato uno nuovo, ma no!

Mi sono perso una fase di configurazione?

Nota: so che se l'laravel_session ottiene rigenerato, il _token è diverso, ma come ho avuto a capire, il token CRSF era anche il meccanismo per evitare più l'invio di moduli, quindi dovrebbe cambiare a ogni aggiornamento della pagina , o almeno dopo che è stato consumato dopo una sottomissione avvenuta con successo, no?

+0

Dove hai letto che il token 'CRSF era anche il meccanismo per evitare l'invio di più moduli ', per favore? – delmadord

+0

È stato anche discusso qui http://stackoverflow.com/questions/17239586/laravel-4-prevent-multiple-form-submissions-csrf-token – delmadord

+0

Mentre quel post spiega un metodo per evitare il nuovo invio del modulo, non spiega il comportamento sul token che non viene consumato. Mi piacerebbe rompere questo, perché sembra un buco di sicurezza. –

risposta

9

Non è necessario aggiornare il token CSRF per ogni richiesta, anche la generazione del token per sessione sarà sicura. Dai uno sguardo allo Owasp cheat sheet per una spiegazione migliore.

La rigenerazione del token per ogni richiesta può essere eseguita, ma può causare problemi di usabilità. Penso che questo sia il motivo per cui Laravel implementa l'approccio token per sessione.

+0

Grazie, questa è una spiegazione abbastanza esaustiva. Sembra che alla fine questo sia il comportamento previsto. –

+0

Se mi disconnetto e ricollego, conta come una modifica di sessione? Voglio dire se mi disconnetto e riaccedi, cambierà il token? – Rohan

+0

@Rohan - In realtà dipende da cosa l'applicazione farà quando l'utente si disconnette. Tecnicamente un cookie di sessione può rimanere valido fino alla chiusura del browser, anche se spesso la sessione viene scartata quando l'utente si disconnette. – martinstoeckli

1

Dal codice, le uniche occorrenze pertinenti _token o regenerateToken sono nella Illuminate/Session/Store, linee 89, 551 e 571. Le occorrenze essendo:

public function start() 
{ 
    $this->loadSession(); 

    if (! $this->has('_token')) $this->regenerateToken(); 

    return $this->started = true; 
} 

public function token() 
{ 
    return $this->get('_token'); 
} 

public function regenerateToken() 
{ 
    $this->put('_token', str_random(40)); 
} 

Ciò significa, che gettone viene rigenerato solo quando non presente in sessioni. Devi rigenerarlo tu stesso, se lo desideri, con Session::forget('_token');