web-dev-qa-db-ja.com

Laravel 4すべてのCSRF POSTリクエスト

最近laravelを調べて、彼らが持っているCSRF保護を理解しようとしています。しかし、それを機能させることができません。送信されたすべての投稿リクエストを検証する方法はありますか? CSRFフィルター?laravelシステムには次のものがあることがわかりました。

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

CSRFフィルターでこれをどのように使用できますか?のようないくつかの異なることを試みてきました

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

しかし、私はおそらくここから遠く離れています..これはどのように機能しますか?それともこのようにすることさえ可能ですか?

14
Dexty

ルートグループを使用できます。これにより、指定したオプションがグループで定義されたすべてのルートに適用されます。

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ファイルに含まれます

23
Blessing

これが最良かつ最も単純な解決策です。

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

ルートをグループ化したり、コンストラクターをいじったりする必要はありません。

30
Rafał Walczak

私のBaseControllerにはこれがあります:

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

そのようなApp::beforeフィルターは興味深いアプローチですが、どちらが良いかわかりませんか?

11
envision

これにより、アプリのすべてのページのすべてのフォームにCSRFを適用できるようになります

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

注:「post」はHTTP POST動詞です-したがって、Laravel post、put、deleteリクエストなどをカバーします。

4
Laurence

どういうわけか置く

$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;
        }
    }
});

それは私にとってトリックでした。

4
Nancho

指定したコードは、フィルターを作成するだけです。それでも、ルーターまたはコントローラーのいずれかで使用する必要があります(必要に応じてベースコントローラーでも使用できます)。

私の意見では、ROUTESでフィルターを使用するのが最適な場所です。

0
Half Crazed

これを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フィルターが追加されます。

0
Victor