Laravel 4 CSRF для всех запросов POST
Заглядывал в ларавелл в последнее время и пытался выяснить, что у них есть защита CSRF. Однако я не могу заставить его работать. Есть ли способ проверить все отправленные запросы с фильтром CSRF? Я видел, что система laravel имеет:
App::before(function($request)
{
//
});
Как я могу использовать это с фильтром CSRF? Пробовал несколько разных вещей, таких как
App::before(function($request)
{
Route::filter('csrf','post');
});
Но я, наверное, ушел отсюда.. как это будет работать? или возможно ли это сделать так?
Ответы
Ответ 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.