Domanda

Django viene fornito con Middleware di protezione CSRF , che genera un token univoco per sessione da utilizzare nei moduli. Esegue la scansione di tutte le POST richieste in arrivo per il token corretto e rifiuta la richiesta se il token è mancante o non valido.

Vorrei usare AJAX per alcune richieste POST, ma le richieste non hanno il token CSRF disponibile. Le pagine non hanno <form> elementi da agganciare e preferirei non confondere il markup inserendo il token come valore nascosto. Immagino che un buon modo per farlo sia quello di esporre un vew come /get-csrf-token/ per restituire il token dell'utente, basandosi sulle regole di scripting cross-site del browser per impedire ai siti ostili di richiederlo.

È una buona idea? Esistono modi migliori per proteggersi dagli attacchi CSRF pur consentendo le richieste AJAX?

È stato utile?

Soluzione

Se sai che avrai bisogno del token CSRF per richieste AJAX, puoi sempre incorporarlo nell'HTML da qualche parte; quindi puoi trovarlo tramite Javascript attraversando il DOM. In questo modo, avrai comunque accesso al token, ma non lo stai esponendo tramite un'API.

Per dirla in altro modo: fallo attraverso i modelli di Django, non tramite il dispatcher di URL. È molto più sicuro in questo modo.

Altri suggerimenti

AGGIORNAMENTO : quanto segue era vero e dovrebbe essere vero se tutti i browser e plugin sono stati implementati correttamente. Purtroppo ora sappiamo che non lo sono e che alcune combinazioni di plug-in e reindirizzamenti del browser possono consentire a un utente malintenzionato di fornire intestazioni arbitrarie su una richiesta tra domini. Sfortunatamente, questo significa che anche AJAX richiede con il & Quot; X-Requested-With: XMLHttpRequest & Quot; l'intestazione deve ora essere protetta da CSRF. Di conseguenza, Django non esonera più le richieste Ajax dalla protezione CSRF .

Risposta originale

Vale la pena ricordare che la protezione delle richieste AJAX da CSRF non è necessaria, poiché i browser non consentono richieste AJAX tra siti. In effetti, il middleware Django CSRF ora esonera automaticamente le richieste AJAX dalla scansione dei token CSRF .

Questo è valido solo se si sta effettivamente controllando l'intestazione X-Requested-With sul lato server per il " XMLHttpRequest " valore (come fa Django) ed esentare solo le richieste AJAX reali dalla scansione CSRF.

Annulla, ho sbagliato. (Vedi commenti.) Puoi impedire l'exploit assicurandoti che JSON segua le specifiche: Assicurati sempre di restituire un oggetto letterale come oggetto di livello superiore. (Non posso garantire che non ci saranno ulteriori exploit. Immagina un browser che fornisce l'accesso al codice non riuscito nei suoi eventi window.onerror!)

Non puoi fare affidamento su regole di cross-site scripting per mantenere private le risposte AJAX. Ad esempio, se si restituisce il token CSRF come JSON, un sito dannoso potrebbe ridefinire il costruttore String o Array e richiedere la risorsa.

bigmattyh è corretto: devi incorporare il token da qualche parte nel markup. In alternativa, puoi rifiutare qualsiasi POST che possiede abbia un referer che non corrisponde . In questo modo, solo le persone con firewall software troppo zelanti saranno vulnerabili alla CSRF.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top