microdot.csrf --- حماية CSRF¶
يرفض الطلبات المُغيّرة للحالة التي تنشأ من مواقع أخرى (cross-site). يعمل الفحص كخطاف 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-siteلـ Sec-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 في المتصفح).