microdot.csrf — CSRF koruması¶
Siteler arası kaynaklı durum değiştiren istekleri reddeder. Kontrol bir before_request kancası olarak çalışır ve tarayıcının sağladığı Sec-Fetch-Site başlığını kullanır (bir microdot.cors.CORS örneğiyle eşleştirildiğinde, eski tarayıcılar için Origin başlığı yedek olarak kullanılır).
class CSRF¶
- class microdot.csrf.CSRF(app: Microdot | None = None, cors=None, protect_all: bool = True, allow_subdomains: bool = False)¶
- app
Üzerine kurulacak
microdot.Microdotörneği. İsteğe bağlıdır; verilmezse daha sonrainitialize()çağrılır.- cors
Uygulamanın güvenilen origin’lerini tanımlayan
microdot.cors.CORSörneği.Sec-Fetch-Sitegöndermeyen tarayıcılardaOriginbaşlığına geri dönmek için gereklidir. İsteğe bağlıdır; bu örnek olmadan yalnızcaSec-Fetch-Sitekontrolü uygulanır.- protect_all
Trueise (varsayılan),GET,HEADveOPTIONSdışındaki her rota otomatik olarak korunur. Rotalarexempt()ile tek tek muaf tutulabilir.Falseise, varsayılan olarak hiçbir rota korunmaz ve tek tek rotalarprotect()ile katılır.- allow_subdomains
Trueise, uygulamanın origin’lerinin alt alan adlarından gelen istekler kabul edilir (same-siteSec-Fetch-Site veya eşleşen origin son eki).
- exempt(f)¶
Bir rotayı CSRF korumasından muaf tutan dekoratör. Doğrudan rota dekoratörünün ardına yerleştirin:
@app.post('/webhook') @csrf.exempt async def webhook(request): # accepts cross-site POSTs
- protect(f)¶
Aksi takdirde muaf olacak bir rotaya (örneğin bir
GETrotası veyaprotect_all=Falseolduğunda her rota) CSRF korumasını zorlayan dekoratör.
Örnek:
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 veya none (veya allow_subdomains=True olduğunda same-site) bildirdiğinde bir isteğe izin verilir. Başlık yoksa, isteğin Origin değeri CORS izin listesine karşı eşleştirilir. Her iki başlık da olmayan istekler kabul edilir (tarayıcı CSRF’sine tabi olmayan doğrudan API çağrıları için tipiktir).