microdot.csrf --- CSRF 保護

クロスサイトで発生する状態変更リクエストを拒否します。このチェックは before_request フックとして実行され、ブラウザが提供する Sec-Fetch-Site ヘッダーを使用します(microdot.cors.CORS インスタンスと組み合わせた場合、古いブラウザ向けのフォールバックとして Origin ヘッダーを使用します)。

class CSRF

class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)
app

インストール先の microdot.Microdot インスタンス。省略可能です。指定しない場合は後で initialize() を呼び出してください。

cors

アプリケーションの信頼できるオリジンを定義する microdot.cors.CORS インスタンス。Sec-Fetch-Site を送信しないブラウザで Origin ヘッダーへフォールバックするために必要です。省略可能です。指定しない場合は Sec-Fetch-Site のチェックのみが適用されます。

protect_all

True(デフォルト)の場合、GETHEADOPTIONS を除くすべてのルートが自動的に保護されます。個々のルートは exempt() で除外できます。False の場合、デフォルトではどのルートも保護されず、個々のルートは protect() でオプトインします。

allow_subdomains

True の場合、アプリケーションのオリジンのサブドメインからのリクエストが受け入れられます(same-site の Sec-Fetch-Site、または一致するオリジンのサフィックス)。

initialize(app: Microdot, cors=None)

構築が遅延されていた場合、app にアタッチします。

exempt(f)

ルートを CSRF 保護から除外するデコレータ。ルートデコレータの直後に配置してください:

@app.post('/webhook')
@csrf.exempt
async def webhook(request):
    # accepts cross-site POSTs
protect(f)

そうでなければ除外されるルート(例: GET ルート、または protect_all=False の場合のすべてのルート)に CSRF 保護を強制するデコレータ。

SAFE_METHODS: list

デフォルトで保護されないメソッドを列挙するクラス属性 -- ['GET', 'HEAD', 'OPTIONS']

例:

from microdot import Microdot
from microdot.cors import CORS
from microdot.csrf import CSRF

app = Microdot()
cors = CORS(app, allowed_origins=['https://app.example.com'])
csrf = CSRF(app, cors=cors)

@app.post('/api/save')
async def save(request):
    # automatically CSRF-protected
    return {'ok': True}

Sec-Fetch-Sitesame-origin または none を報告する場合(または allow_subdomains=True のときに same-site の場合)、リクエストは許可されます。このヘッダーが存在しない場合、リクエストの Origin が CORS 許可リストと照合されます。どちらのヘッダーも持たないリクエストは受け入れられます(ブラウザの CSRF の対象とならない直接の API 呼び出しで一般的です)。