2013-08-22 9 views
9

Я на самом деле играю с Laravel 4. Сейчас я реализовал безопасность токенов CSRF в сообщении формы.Почему токен Laravel 4 CSRF не работает?

Проблема заключается в том, что это фактически не работает в том смысле, что токен, сгенерированный в сеансе Session::token(), всегда такой же, поэтому, когда я пытаюсь повторно отправить форму или даже отправить форму с другого сервера, проверка не работает Session::token() != Input::get('_token') (filters.php)

Кто-нибудь уже столкнулся с этой проблемой?

EDIT:
Хорошо, я нашел объяснение этого. Токен на самом деле отличается для каждой машины/сеанса. Это имеет смысл сейчас :) Спасибо всем за вашу помощь

ответ

1

Внутри формы вы должны создать маркер, как это:

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

После того, что маркер будет послан с входом. Итак, когда вы получаете вход, вы должны проверить маркер, как это:

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

Таким образом, вы будете размещать фильтр перед маршрут доступен, который проверяет маркер CSRF.

Получил это из документации Laravel право here

+0

Благодарим за ответ. Я сделал все это, но моя проблема связана с самим токеном, который не обновляется. Даже если я обновляю страницу, токен остается тем же, поэтому фильтр всегда будет возвращать true. – lkartono

9

, когда форма была отправлена, после обработки формы вы должны изменить CSRF токен как Session::put('_token', md5(microtime())); это защитит от формы повторного представления .. Для получения дополнительной информации вы можете увидеть this и this

+1

Благодарим вас за ответ. Действительно, пока это единственный способ, который работает, но я думаю, что это действительно глупо давать разработчикам проверку безопасности csrf-token из коробки, если нам все еще нужно заботиться о таких деталях. Это должно работать из коробки :(Еще раз спасибо – lkartono

+0

Wow. Я просто проверил это и получил один и тот же токен несколько раз.Вы должны задаться вопросом, что, по их мнению, указывает токен CSRF ... Интересно, исправлено ли это в 5. – DanielM

3

Я использую встроенную функцию regenerateToken таким образом в моем приложение/filter.php:

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

Другое примечание при перенаправлении с помощью ввода!

В Laravel 4 маркер генерируется, когда вы используете {{Form :: открытым (...)}} таким образом:

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

Так он использует скрытый ввод, который установит его значение из функции Input :: old, если оно существует.

Чтобы предотвратить это, Вы должны будете использовать Input :: кроме («_ лексема»), если вы не хотели бы, чтобы сделать форму с уже устаревшей лексемы, как это:

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

При использовании Blade для создания формы, _token автоматически отображается внутри формы

<?php echo Form::open(array('url' => '/', 'files' => true, 'id' => 'shareForm', 'method' => 'post')) ?> 
... 
HTML 
... 
<?php echo Form::close() ?> 
Смежные вопросы