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(デフォルト)の場合、GET、HEAD、OPTIONSを除くすべてのルートが自動的に保護されます。個々のルートはexempt()で除外できます。Falseの場合、デフォルトではどのルートも保護されず、個々のルートはprotect()でオプトインします。- allow_subdomains
Trueの場合、アプリケーションのオリジンのサブドメインからのリクエストが受け入れられます(same-siteの Sec-Fetch-Site、または一致するオリジンのサフィックス)。
- exempt(f)¶
ルートを CSRF 保護から除外するデコレータ。ルートデコレータの直後に配置してください:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
そうでなければ除外されるルート(例:
GETルート、またはprotect_all=Falseの場合のすべてのルート)に CSRF 保護を強制するデコレータ。
例:
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-Site が same-origin または none を報告する場合(または allow_subdomains=True のときに same-site の場合)、リクエストは許可されます。このヘッダーが存在しない場合、リクエストの Origin が CORS 許可リストと照合されます。どちらのヘッダーも持たないリクエストは受け入れられます(ブラウザの CSRF の対象とならない直接の API 呼び出しで一般的です)。