from django.http import HttpResponseForbidden
class FetchMetadataMiddleware:
SAFE_METHODS = {"GET", "HEAD", "OPTIONS"}
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
fetch_site = request.headers.get("Sec-Fetch-Site")
if (
request.method not in self.SAFE_METHODS
and fetch_site == "cross-site"
):
return HttpResponseForbidden(
"Cross-site state-changing request denied."
)
return self.get_response(request)
ただし、次の経路は事前に確認します。
ネイティブアプリ
古いブラウザ
APIクライアント
Webhook
外部IdP
決済サービス
OAuthコールバック
クロスサイト埋め込み
Fetch MetadataはCSRFトークンの代わりではなく、追加防御として使います。