Laravel 4 CSRF для всех запросов POST - программирование
Подтвердить что ты не робот

Laravel 4 CSRF для всех запросов POST

Заглядывал в ларавелл в последнее время и пытался выяснить, что у них есть защита CSRF. Однако я не могу заставить его работать. Есть ли способ проверить все отправленные запросы с фильтром CSRF? Я видел, что система laravel имеет:

    App::before(function($request)
{
    //
});

Как я могу использовать это с фильтром CSRF? Пробовал несколько разных вещей, таких как

App::before(function($request)
{
    Route::filter('csrf','post');
});

Но я, наверное, ушел отсюда.. как это будет работать? или возможно ли это сделать так?

4b9b3361

Ответ 1

Вы можете использовать группы маршрутов. Это применит указанные параметры к любым маршрутам, определенным в группе:

Route::group(array('before' => 'csrf'), function()
{
    Route::post('/', function()
    {
    // Has CSRF Filter
    });

    Route::post('user/profile', function()
    {
    // Has CSRF Filter
    });

    Route::post(....);
});

Для определенных маршрутов или если группировка не является тем, что вы хотите, вы также можете использовать фильтр шаблонов:

//all routes beginning with admin, sent via a post http request will use the csrf filter
Route::when('admin/*', 'csrf', array('post'));

ПРИМЕЧАНИЕ: этот код будет находиться в файле routes.php

Ответ 2

Это лучшее и самое простое решение:

Route::when('*', 'csrf', array('post'));

Не нужно группировать маршруты или беспорядок с конструкторами.

Ответ 3

В моем BaseController у меня есть это:

public function __construct()
{
    $this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));
    $this->beforeFilter('ajax', array('on' => array('delete', 'put')));
}

Наличие такого фильтра App::before - интересный подход, но я не знаю, что лучше?

Ответ 4

По какой-то причине класть

$this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));

в BaseController.php не работает для меня; Я сделал тест с поддельными жетонами. Поэтому я пришел со следующим решением:

routes.php:

Route::group(array('before' => 'csrf'), function() {
    Route::resource('areas', 'AreaController');
    Route::resource('usuarios', 'UsuarioController');
    // ... more stuff
});

filters.php(секция фильтра csrf):

Route::filter('csrf', function()
{
    if ($_SERVER['REQUEST_METHOD'] === 'POST' || $_SERVER['REQUEST_METHOD'] === 'PUT') {
        if (Session::token() != Input::get('_token'))
        {
            throw new Illuminate\Session\TokenMismatchException;
        }
    }
});

Это помогло мне.

Ответ 5

Это позволит вам применять CSRF ко всем формам на всех страницах вашего приложения.

App::before(function($request)
{
    if ($request->getMethod() === 'POST') {
        Route::callRouteFilter('csrf', [], '', $request);
    }
});

Примечание: "post" - это HTTP POST-глагол, поэтому он будет охватывать сообщения Laravel, отправлять, удалять запросы и т.д.

Ответ 6

Предоставленный вами код создает фильтр. Вы все равно должны использовать его в своем ROUTER или CONTROLLER (даже если это необходимо в базовом контролере).

По-моему, использование фильтра в ваших маршрутах - лучшее место для его использования.

Ответ 7

Просто добавьте это в BaseController.

// Be sure to call parent::__construct() when needed
public function __construct()
{
    // Perform CSRF check on all post/put/patch/delete requests
    $this->beforeFilter('csrf', array('on' => array('post', 'put', 'patch', 'delete')));
}

Это добавляет фильтр CSRF ко всем запросам post, put, patch и delete.