Spaces:
Sleeping
Sleeping
File size: 1,089 Bytes
1e2e946 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | """
utils/security.py — Security headers and upload hardening.
"""
import re
import secrets
import unicodedata
_FILENAME_SAFE = re.compile(r"[^A-Za-z0-9._-]")
def secure_upload_name(filename: str) -> str:
"""
Normalize a user-supplied filename to a safe ASCII name with a random
prefix (prevents traversal, collisions, and overwrites).
"""
filename = unicodedata.normalize("NFKD", filename or "file")
filename = filename.rsplit("/", 1)[-1].rsplit("\\", 1)[-1]
filename = _FILENAME_SAFE.sub("_", filename).strip("._") or "file"
return f"{secrets.token_hex(8)}_{filename[:120]}"
def apply_security_headers(response):
"""Defensive HTTP headers applied to every response by app.py."""
response.headers.setdefault("X-Content-Type-Options", "nosniff")
response.headers.setdefault("X-Frame-Options", "SAMEORIGIN")
response.headers.setdefault("Referrer-Policy", "strict-origin-when-cross-origin")
response.headers.setdefault(
"Permissions-Policy", "camera=(self), geolocation=(self), microphone=(self)"
)
return response
|