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-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).