flask-talisman + naglowki

This commit is contained in:
Mateusz Gruszczyński
2025-07-25 19:01:52 +02:00
parent be986fc8f5
commit 5e782ba170
4 changed files with 55 additions and 1 deletions

View File

@@ -50,4 +50,29 @@ DB_HOST=pgsql
DB_PORT=5432
DB_NAME=myapp
DB_USER=user
DB_PASSWORD=pass
DB_PASSWORD=pass
# ========================
# Nagłówki bezpieczeństwa
# ========================
# ENABLE_HSTS:
# Wymusza HTTPS poprzez ustawienie nagłówka Strict-Transport-Security.
# Zalecane (1) jeśli aplikacja działa za HTTPS. Ustaw 0, jeśli korzystasz z HTTP lokalnie.
ENABLE_HSTS=1
# ENABLE_XFO:
# Ustawia nagłówek X-Frame-Options: DENY, który blokuje osadzanie strony w <iframe>.
# Chroni przed atakami typu clickjacking. Ustaw 0, jeśli celowo korzystasz z osadzania.
ENABLE_XFO=1
# ENABLE_XCTO:
# Ustawia nagłówek X-Content-Type-Options: nosniff, który zapobiega sniffowaniu MIME przez przeglądarkę.
# Chroni przed błędną interpretacją typów plików (np. skrypt JS jako obraz). Zalecane: 1.
ENABLE_XCTO=1
# ENABLE_CSP:
# Ustawia podstawową politykę Content-Security-Policy (CSP), która ogranicza wczytywanie zasobów tylko z własnej domeny.
# Zalecane: 1. Ustaw 0, jeśli używasz zewnętrznych skryptów lub masz problemy z WebSocketami (w CSP: connect-src 'self').
ENABLE_CSP=1

23
app.py
View File

@@ -49,6 +49,7 @@ from sqlalchemy import func, extract, inspect, or_
from sqlalchemy.orm import joinedload
from collections import defaultdict, deque
from functools import wraps
from flask_talisman import Talisman
# OCR
from collections import Counter
@@ -58,6 +59,28 @@ from pytesseract import Output
app = Flask(__name__)
app.config.from_object(Config)
# Konfiguracja nagłówków bezpieczeństwa z .env
csp_policy = None
if app.config.get("ENABLE_CSP", True):
csp_policy = {
'default-src': "'self'",
'script-src': "'self'",
'style-src': "'self'",
'connect-src': "'self'",
}
talisman = Talisman(
app,
force_https=app.config.get("ENABLE_HSTS", True),
strict_transport_security=app.config.get("ENABLE_HSTS", True),
frame_options="DENY" if app.config.get("ENABLE_XFO", True) else None,
content_security_policy=csp_policy,
x_content_type_options=app.config.get("ENABLE_XCTO", True),
)
register_heif_opener() # pillow_heif dla HEIC
ALLOWED_EXTENSIONS = {"png", "jpg", "jpeg", "gif", "webp", "heic"}

View File

@@ -30,3 +30,8 @@ class Config:
SESSION_TIMEOUT_MINUTES = int(os.environ.get("SESSION_TIMEOUT_MINUTES", "10080") or "10080")
except ValueError:
SESSION_TIMEOUT_MINUTES = 10080
ENABLE_HSTS = os.environ.get("ENABLE_HSTS", "1") == "1"
ENABLE_XFO = os.environ.get("ENABLE_XFO", "1") == "1"
ENABLE_XCTO = os.environ.get("ENABLE_XCTO", "1") == "1"
ENABLE_CSP = os.environ.get("ENABLE_CSP", "1") == "1"

View File

@@ -14,3 +14,4 @@ opencv-python-headless
psycopg2-binary # pgsql
pymysql # mysql
cryptography # mysql8
flask-talisman # nagłówki