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, 또는 일치하는 출처 접미사).

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 호출에서 일반적입니다).