Задать вопрос

Нужно ли использовать CSRF token в Ajax Post запросах без форм и ввода данных?

В документации по Laravel 4 и сторонних источниках очень много говорится про csrf token. Но насколько я понимаю, он включается только в формах. А если используется AJAX подгрузка контента без использования формы? В routes.php устанавливал
Route::post('test', array('before'=>'csrf', 'uses'=>'HomeController@foo');

После этого ajax запрос не проходил. В консоли пишет 500 Internal Server Error. В источниках говорят, что нужно включать ту самую функцию token, которую ставим в формах.
И сам вопрос. Нужно ли? И если нужно, то как?
  • Вопрос задан
  • 18582 просмотра
Подписаться 14 Оценить Комментировать
Решения вопроса 2
sintez
@sintez
Я не знаю как конкретно в Laravel, но в принципе CSRF токен должен передаваться при любых POST запросах на сервер.
UPD:
Почитал документацию к Laravel, там все доходчиво написано. Получить токен можно с помощью <?php echo csrf_token(); ?>. Т.к. у вас нет форм, то можно сделать следующим образом:
1. В header добавить тег
<meta name="_token" content="<?php echo csrf_token(); ?>">

2. Далее, если вы используете jQuery, то добавление токена в запрос будет выглядеть следующим образом.
var csrftoken = $('meta[name=_token]').attr('content');
$.ajaxSetup({
    beforeSend: function (xhr, settings) {
        if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken)
        }
    }
});
Ответ написан
cyberS7
@cyberS7 Автор вопроса
Реализовал следующим образом.
Добавляем в хэдер страницы token.
<head>
 <meta name="csrf-token" content="{{ csrf_token() }}">
</head>


В роутах прописываем фильтр csrf-ajax.
Route::filter('csrf-ajax', function()
{
    if (Session::token() != Request::header('x-csrf-token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});


И добавляем его в post-запрос.
Route::post('test', array('before'=>'csrf-ajax', 'as'=>'test', 'uses'=>'FooController@foo'));

в Ajax
...  
$.ajax({
    		    url: "test",
                    data: ...,
                    type: "POST",
                    beforeSend: function(request) {
        return request.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-token']").attr('content'));
    },
 ...

Вроде как работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы