25 lines
667 B
Python
25 lines
667 B
Python
from __future__ import annotations
|
|
|
|
import secrets
|
|
|
|
from flask import request, session
|
|
|
|
|
|
def csrf_token() -> str:
|
|
token = session.get("_csrf_token")
|
|
if not token:
|
|
token = secrets.token_urlsafe(32)
|
|
session["_csrf_token"] = token
|
|
return token
|
|
|
|
|
|
def validate_csrf_token() -> bool:
|
|
expected = session.get("_csrf_token", "")
|
|
received = request.form.get("csrf_token") or request.headers.get("X-CSRFToken", "")
|
|
return bool(expected and received and secrets.compare_digest(expected, received))
|
|
|
|
|
|
def new_captcha() -> str:
|
|
alphabet = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"
|
|
return "".join(secrets.choice(alphabet) for _ in range(5))
|