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ọiinitialize()sau nếu không được cung cấp.- cors
Phiên bản
microdot.cors.CORSxác định các origin tin cậy của ứng dụng. Cần thiết để dự phòng sang headerOrigintrên các trình duyệt không gửiSec-Fetch-Site. Tùy chọn; nếu không có, chỉ kiểm traSec-Fetch-Siteđược áp dụng.- protect_all
Nếu là
True(mặc định), mọi route ngoại trừGET,HEADvàOPTIONSđều được bảo vệ tự động. Các route có thể được miễn trừ riêng lẻ bằngexempt(). 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ằngprotect().- 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-siteSec-Fetch-Site, hoặc hậu tố origin khớp nhau).
- 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
GEThoặc mọi route khiprotect_all=False).
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).