Sicurezza
Django eâ un framework che pone grande enfasi sulla sicurezza. Include numerose protezioni integrate contro le vulnerabilitaâ web piuâ comuni, rendendo piuâ semplice per gli sviluppatori costruire applicazioni sicure fin dallâinizio.
Protezione contro XSS (Cross-Site Scripting)
Django protegge automaticamente contro gli attacchi XSS grazie allâescaping automatico nei template. Qualsiasi variabile renderizzata in un template viene automaticamente âescapedâ, impedendo lâesecuzione di codice JavaScript malevolo.
# Nel template, il contenuto viene automaticamente escaped
# Se nome_utente = "<script>alert('xss')</script>"
# Django renderizza: <script>alert('xss')</script>
# Template esempio
# {{ nome_utente }} --> sicuro, viene escaped automaticamente
# ATTENZIONE: il filtro |safe disabilita l'escaping
# {{ contenuto_html|safe }} --> usare solo con contenuti fidati
Protezione contro SQL Injection
Django utilizza un ORM che parametrizza automaticamente tutte le query al database, prevenendo attacchi di SQL injection.
# SICURO: Django parametrizza la query automaticamente
utenti = Utente.objects.filter(email=email_inserita)
# SICURO: anche con query raw parametrizzate
Utente.objects.raw('SELECT * FROM auth_user WHERE email = %s', [email_inserita])
# PERICOLOSO: mai concatenare stringhe nelle query
# Utente.objects.raw(f'SELECT * FROM auth_user WHERE email = {email_inserita}')
Protezione contro il Clickjacking
Il XFrameOptionsMiddleware impedisce che il tuo sito venga incorporato in un iframe di un altro sito, proteggendo contro attacchi di clickjacking.
# settings.py
MIDDLEWARE = [
# ...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# Opzioni disponibili
X_FRAME_OPTIONS = 'DENY' # Blocca tutti gli iframe
# X_FRAME_OPTIONS = 'SAMEORIGIN' # Permette iframe dallo stesso dominio
Per escludere specifiche view dalla protezione, puoi usare il decoratore:
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def mia_view(request):
return HttpResponse("Questa pagina puo' essere in un iframe")
SecurityMiddleware e Impostazioni HTTPS/SSL
Il SecurityMiddleware di Django gestisce diversi aspetti della sicurezza legati al protocollo HTTPS.
# settings.py
# Reindirizza tutto il traffico HTTP a HTTPS
SECURE_SSL_REDIRECT = True
# Attiva l'header HSTS (HTTP Strict Transport Security)
SECURE_HSTS_SECONDS = 31536000 # 1 anno
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
# Il cookie di sessione viene inviato solo su HTTPS
SESSION_COOKIE_SECURE = True
# Il cookie CSRF viene inviato solo su HTTPS
CSRF_COOKIE_SECURE = True
# Impedisce al browser di interpretare i file con un tipo MIME diverso
SECURE_CONTENT_TYPE_NOSNIFF = True
# Configura il referrer policy
SECURE_REFERRER_POLICY = 'strict-origin-when-cross-origin'
# Imposta l'header Cross-Origin Opener Policy
SECURE_CROSS_ORIGIN_OPENER_POLICY = 'same-origin'
Content-Security-Policy
Django non include nativamente un header CSP, ma puoi implementarlo facilmente con il pacchetto django-csp oppure tramite un middleware personalizzato.
# Installazione: pip install django-csp
# settings.py
MIDDLEWARE = [
'csp.middleware.CSPMiddleware',
# ...
]
# Configurazione CSP
CONTENT_SECURITY_POLICY = {
"DIRECTIVES": {
"default-src": ["'self'"],
"script-src": ["'self'", "https://cdn.esempio.com"],
"style-src": ["'self'", "'unsafe-inline'"],
"img-src": ["'self'", "data:", "https:"],
}
}
In alternativa, puoi aggiungere lâheader manualmente tramite middleware:
class CSPMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
response['Content-Security-Policy'] = "default-src 'self'; script-src 'self'"
return response
Configurazione di Sicurezza per la Produzione
Quando si effettua il deploy in produzione, eâ fondamentale verificare tutte le impostazioni di sicurezza. Django mette a disposizione un comando utile:
# Controlla la configurazione di sicurezza
# python manage.py check --deploy
# Questo comando segnala eventuali problemi come:
# - DEBUG = True in produzione
# - SECRET_KEY debole o esposta
# - Impostazioni SECURE_* mancanti
# - Cookie senza flag Secure
Conclusione
Django offre un sistema di sicurezza completo e stratificato che protegge le applicazioni web dalle vulnerabilitaâ piuâ diffuse. Sfruttare correttamente le protezioni integrate contro XSS, SQL injection, clickjacking e configurare adeguatamente le impostazioni HTTPS e CSP eâ essenziale per costruire applicazioni web sicure e affidabili.