00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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: &lt;script&gt;alert('xss')&lt;/script&gt;

# 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.