wersja 0.0.4 #7
27
.env.example
27
.env.example
@@ -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
23
app.py
@@ -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"}
|
||||
|
@@ -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"
|
||||
|
@@ -14,3 +14,4 @@ opencv-python-headless
|
||||
psycopg2-binary # pgsql
|
||||
pymysql # mysql
|
||||
cryptography # mysql8
|
||||
flask-talisman # nagłówki
|
Reference in New Issue
Block a user