最近laravelを調べて、彼らが持っているCSRF保護を理解しようとしています。しかし、それを機能させることができません。送信されたすべての投稿リクエストを検証する方法はありますか? CSRFフィルター?laravelシステムには次のものがあることがわかりました。
App::before(function($request)
{
//
});
CSRFフィルターでこれをどのように使用できますか?のようないくつかの異なることを試みてきました
App::before(function($request)
{
Route::filter('csrf','post');
});
しかし、私はおそらくここから遠く離れています..これはどのように機能しますか?それともこのようにすることさえ可能ですか?
ルートグループを使用できます。これにより、指定したオプションがグループで定義されたすべてのルートに適用されます。
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ファイルに含まれます
これが最良かつ最も単純な解決策です。
Route::when('*', 'csrf', array('post'));
ルートをグループ化したり、コンストラクターをいじったりする必要はありません。
私のBaseControllerにはこれがあります:
public function __construct()
{
$this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));
$this->beforeFilter('ajax', array('on' => array('delete', 'put')));
}
そのようなApp::before
フィルターは興味深いアプローチですが、どちらが良いかわかりませんか?
これにより、アプリのすべてのページのすべてのフォームにCSRFを適用できるようになります
App::before(function($request)
{
if ($request->getMethod() === 'POST') {
Route::callRouteFilter('csrf', [], '', $request);
}
});
注:「post」はHTTP POST動詞です-したがって、Laravel post、put、deleteリクエストなどをカバーします。
どういうわけか置く
$this->beforeFilter('csrf', array('on' => array('post', 'delete', 'put')));
baseController.phpへの変換は私には機能しませんでした。私は偽のトークンでテストを行いました。だから私は次の解決策を思いついた:
ルート.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;
}
}
});
それは私にとってトリックでした。
指定したコードは、フィルターを作成するだけです。それでも、ルーターまたはコントローラーのいずれかで使用する必要があります(必要に応じてベースコントローラーでも使用できます)。
私の意見では、ROUTESでフィルターを使用するのが最適な場所です。
これを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フィルターが追加されます。