microdot.csrf — הגנת CSRF¶
דוחה בקשות משנות-מצב שמקורן בין-אתרי. הבדיקה רצה כהוק before_request ומשתמשת בכותרת Sec-Fetch-Site שהדפדפן מספק (עם כותרת Origin כגיבוי עבור דפדפנים ישנים יותר, כאשר היא מותאמת עם מופע microdot.cors.CORS).
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המגדיר את המקורות המהימנים של היישום. נדרש כדי לגבות באמצעות כותרתOriginבדפדפנים שאינם שולחיםSec-Fetch-Site. אופציונלי; ללא זה, חלה רק בדיקת ה-Sec-Fetch-Site.- protect_all
אם
True(ברירת מחדל), כל נתיב למעטGET,HEADו-OPTIONSמוגן אוטומטית. ניתן לפטור נתיבים בנפרד באמצעותexempt(). אםFalse, אף נתיב אינו מוגן כברירת מחדל ונתיבים בודדים בוחרים להצטרף באמצעותprotect().- allow_subdomains
אם
True, בקשות מתת-דומיינים של מקורות היישום מתקבלות (same-siteSec-Fetch-Site, או סיומת מקור תואמת).
- exempt(f)¶
דקורטור שפוטר נתיב מהגנת CSRF. הציבו אותו ישירות אחרי דקורטור הנתיב:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
דקורטור שכופה הגנת CSRF על נתיב שאחרת היה פטור (למשל נתיב
GETאו כל נתיב כאשרprotect_all=False).
דוגמה:
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 (או same-site כאשר allow_subdomains=True). אם הכותרת נעדרת, ה-Origin של הבקשה מושווה לרשימת ההיתרים של CORS. בקשות ללא אף אחת מהכותרות מתקבלות (אופייני לקריאות API ישירות שאינן כפופות ל-CSRF של דפדפן).