この Symfony バンドルは、Symfony が XHR を通じて提供するエンドポイントをリクエストするクライアント側アプリケーションにクロスサイト リクエスト フォージェリ (CSRF または XSRF) 保護を提供します。
DunglasAngularCsrfBundle に多大な影響とインスピレーションを受けています
CSRF トークンをクライアント側に保存するために、1 つ以上の事前に決定されたルートによってトークンを含む Cookie を設定できます。このバンドルは、Axios などの最新のクライアント側 http クライアントが上記の Cookie を自動的に取得するように事前設定されています。 Symfony への後続のリクエストでは、CSRF トークンを HTTP ヘッダーに追加してサーバー側で検証できます。繰り返しになりますが、Axios などの一部のクライアントはすでに自動的にこれを行っている可能性があります。
Composer を使用してこのバンドルをインストールします。
composer require dneustadt/csrf-cookie-bundle
# config/packages/dneustadt_csrf_cookie.yaml
dneustadt_csrf_cookie :
# Generally enable/disable the CSRF protection
enable : true
# ID used to generate token
id : csrf
# Name of the cookie the token is stored in
name : XSRF-TOKEN
# Cookie expiration
expire : 0
# Cookie path
path : /
# Cookie domain
domain : null
# Cookie HttpOnly
httpOnly : true
# Cookie secure
secure : false
# Name of the HTTP header the token is expected to be stored in
header : X-XSRF-TOKEN
# Cookie same site policy
sameSite : lax
ルートは、トークンを提供する ( create
)、トークンによって保護される ( require
)、またはその両方を行うように設定できます。
単一ルートまたはルート コレクションのデフォルトは動作の設定に使用されるため、設定ファイルまたはアノテーションを使用して動作を設定することができます。
# config/routes.yaml
api_controllers :
resource : ../src/Controller/Api
type : annotation
defaults :
csrf :
# bool or array of allowed methods
create : true
# bool or array of allowed methods
require :
- ' POST '
- ' PUT '
- ' PATCH '
- ' DELETE '
# array of route names to be excluded from create/require in this collection
exclude :
- ' app_api_blog_index '
# additional condition using ExpressionLanguage syntax
condition : ' request.isXmlHttpRequest() '
条件の詳細については、「ExpressionLanguage」を参照してください。
注釈として:
// src/Controller/Api/ExampleController.php
namespace App Controller Api ;
// ...
class ExampleController extends AbstractController
{
/**
* @Route("/api/index", methods={"GET","HEAD"}, defaults={"csrf": {"create": true}})
*/
public function index ()
{
// ...
}
}
フォームの組み込み CSRF 保護は、HTTP ヘッダーに保存されているトークンを使用してセキュリティで保護されるように構成されているルートに対して、そのトークンが正常に検証できた場合に自動的に無効になります。