microdot.csrf --- Bảo vệ CSRF

Từ chối các yêu cầu thay đổi trạng thái có nguồn gốc cross-site. Kiểm tra chạy như một hook before_request và sử dụng header Sec-Fetch-Site do trình duyệt cung cấp (với header Origin làm dự phòng cho các trình duyệt cũ hơn, khi kết hợp với phiên bản microdot.cors.CORS).

class CSRF

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

Phiên bản microdot.Microdot để cài đặt vào. Tùy chọn; gọi initialize() sau nếu không được cung cấp.

cors

Phiên bản microdot.cors.CORS xác định các origin tin cậy của ứng dụng. Cần thiết để dự phòng sang header Origin trên các trình duyệt không gửi Sec-Fetch-Site. Tùy chọn; nếu không có, chỉ kiểm tra Sec-Fetch-Site được áp dụng.

protect_all

Nếu là True (mặc định), mọi route ngoại trừ GET, HEADOPTIONS đều được bảo vệ tự động. Các route có thể được miễn trừ riêng lẻ bằng exempt(). Nếu là False, không có route nào được bảo vệ theo mặc định và từng route phải đăng ký tham gia bằng protect().

allow_subdomains

Nếu là True, các yêu cầu từ subdomain của các origin ứng dụng được chấp nhận (same-site Sec-Fetch-Site, hoặc hậu tố origin khớp nhau).

initialize(app: Microdot, cors=None)

Gắn vào app nếu việc khởi tạo bị trì hoãn.

exempt(f)

Decorator miễn trừ một route khỏi bảo vệ CSRF. Đặt nó ngay sau decorator route:

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

Decorator buộc bảo vệ CSRF trên một route mà nếu không sẽ được miễn trừ (ví dụ: route GET hoặc mọi route khi protect_all=False).

SAFE_METHODS: list

Thuộc tính lớp liệt kê các phương thức không được bảo vệ theo mặc định -- ['GET', 'HEAD', 'OPTIONS'].

Ví dụ:

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}

Một yêu cầu được phép khi Sec-Fetch-Site báo cáo same-origin hoặc none (hoặc same-site khi allow_subdomains=True). Nếu header vắng mặt, Origin của yêu cầu được đối chiếu với danh sách cho phép CORS. Các yêu cầu không có header nào được chấp nhận (thông thường đối với các lệnh gọi API trực tiếp không thuộc phạm vi CSRF của trình duyệt).