2013-08-22 19 views
9

In realtà sto giocando con Laravel 4. In questo momento ho implementato la sicurezza del token CSRF sul modulo postale.Perché il token CSRF di Laravel 4 non funziona?

Il problema è che, in realtà, questo non funziona nel senso che il token generato nella sessione Session::token() è sempre lo stesso, quindi quando provo a inviare nuovamente un modulo o anche a inviare un modulo da un altro server, la sicurezza check non funziona Session::token() != Input::get('_token') (filters.php)

Chiunque ha già affrontato questo problema?

MODIFICA:
Ok ho trovato la spiegazione di questo. Il token è in realtà diverso per ogni macchina/sessione. Ha più senso ora :) Grazie a tutti per il vostro aiuto

risposta

1

All'interno del modulo è necessario per creare il token in questo modo:

<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>"> 

Dopo che il token verrà inviato con l'ingresso. Così, quando si riceve l'input È necessario controllare il token in questo modo:

Route::post('register', array('before' => 'csrf', function() 
{ 
    return 'You gave a valid CSRF token!'; 
})); 

In questo modo vi posto un filtro prima che il percorso è accessibile che controlla il token CSRF.

ottenuto questo dalla documentazione laravel destra here

+0

Grazie per la risposta. Ho fatto tutto questo, ma il mio problema riguarda il token stesso che non è aggiornato. Anche se aggiorno la pagina, il token è sempre lo stesso, quindi il filtro tornerà sempre true. – lkartono

9

quando il modulo viene inviato, dopo l'elaborazione del modulo è necessario modificare la CSRF gettone come Session::put('_token', md5(microtime())); questo proteggerà dalla forma ri-presentazione .. Per ulteriori informazioni è possibile vedere this e this

+1

Grazie per la risposta. In effetti, finora questo è l'unico modo in cui funziona, ma penso che sia davvero stupido dare agli sviluppatori un controllo di sicurezza del token csrf out of the box se dobbiamo ancora preoccuparci di questo tipo di dettagli. Questo dovrebbe funzionare immediatamente :(Grazie ancora – lkartono

+0

Wow. L'ho appena provato e ho ottenuto lo stesso token più volte.Devi chiederti che cosa pensano che il punto di un token CSRF sia ... Mi chiedo se sia corretto in 5. – DanielM

3

io uso la funzione built-in regenerateToken questo modo nel mio app/filter.php:

Route::filter('csrf', function() 
{ 
    if (Session::token() != Input::get('_token')) 
    { 
     Session::regenerateToken(); 
     return *Redirect/Exception* 
    } 
    Session::regenerateToken(); 
}); 

Un'altra nota quando si reindirizza con l'input!

Nel laravel 4 il token viene generato quando si utilizza {{Modulo :: aperta (...)}} in questo modo:

public function token() 
{ 
    return $this->hidden('_token', $this->csrfToken); 
} 

Quindi utilizza un input nascosto, che consentirà di definire la sua valore dalla funzione Input :: old se esiste.

Per evitare questo è necessario utilizzare la funzione Input :: eccezione ('_ token') se non volete fare un modulo con un token già superata in questo modo:

return Redirect::route('routename')->withInput(Input::except('_token')); 
0

Quando si utilizza Blade per creare il form, _token viene automaticamente reso all'interno del modulo

<?php echo Form::open(array('url' => '/', 'files' => true, 'id' => 'shareForm', 'method' => 'post')) ?> 
... 
HTML 
... 
<?php echo Form::close() ?>