最近一直在调查laravel,并试图找出他们拥有的CSRF保护。但是,我无法让它发挥作用。有什么方法可以使用CSRF过滤器验证提交的所有发布请求吗?我已经看到laravel系统有:
App::before(function($request)
{
//
});
我如何在CSRF过滤器中使用它?正在尝试一些不同的事情,如
App::before(function($request)
{
Route::filter('csrf','post');
});
但我可能会离开这里..这怎么会有用?或者甚至可以这样做?
答案 0 :(得分:30)
这是最好也是最简单的解决方案:
Route::when('*', 'csrf', array('post'));
无需分组路线或弄乱构造函数。
答案 1 :(得分:23)
您可以使用路线组。这会将指定的选项应用于组中定义的任何路径:
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 :(得分:11)
在我的BaseController中我有这个:
public function __construct()
{
$this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));
$this->beforeFilter('ajax', array('on' => array('delete', 'put')));
}
拥有这样的App::before
过滤器是一种有趣的方法,但我不知道哪个更好?
答案 3 :(得分: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;
}
}
});
这对我有用。
答案 4 :(得分:4)
这将允许您将CSRF应用于应用程序所有页面的所有表单
App::before(function($request)
{
if ($request->getMethod() === 'POST') {
Route::callRouteFilter('csrf', [], '', $request);
}
});
注意:'post'是HTTP POST动词 - 因此它将涵盖Laravel发布,发送,删除请求等。
答案 5 :(得分:0)
您提供的代码仅创建过滤器。您仍然需要在ROUTER或CONTROLLER中使用它(如果需要,甚至在基本控制器中)。
在我看来,使用ROUTES中的过滤器是使用它的最佳位置。
答案 6 :(得分:0)
只需将其添加到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过滤器添加到所有发布,放置,修补和删除请求中。