×
サイバー攻撃について
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トークンの代わりではなく、追加防御として使います。