2011-11-10 15 views
6

Dopo aver cercato su Internet, le persone di solito si occupano di questa situazione --- il front-end è generato dalla funzione django view che può inviare all'utente il cookie del token csrf. Quando l'utente ha una richiesta al server usando ajax, le persone possono riscrivere il comportamento ajaxSend che invia il csrf al server.Django CSRF quando back-end e frontend sono separati

Tuttavia, la mia situazione è che il mio front-end è totalmente separato dal back-end, cioè il mio front-end è in un server dedicato su cui gira nginx e ho solo un html che fornisce tutte le diverse pagine usando hashbang . Il mio back-end è in esecuzione su server diversi con nomi di dominio diversi, e in questo caso, in che modo il client ottiene il cookie csrf? Il mio back-end ha fornito solo json api return.

Grazie.

+0

si prega di rispondere a qualcuno questo = / – holms

risposta

0

If you look at the CRSF token source: you can see that all the csrf_middleware does it check the cookie against the post value. Hai solo bisogno di riportare il valore del post sul tuo server poiché il cookie dovrebbe essere già impostato su ajax. If you look at the template tag source you can see that it is just taking the variable out of the context. O rispondi alla tua risposta estraendola dal contesto se è disponibile o calling the context processor directly. Ora devi solo rimandarla come la variabile POST crsf_token.

0

Diciamo che il frontend ha il dominio frontend.example.com e backend dominio backend.example.com. (Se sei qualcosa come il framework di Django) Se puoi usare ci sono due modi per abilitare il livello di sicurezza i.e.,. CSRF protezione o CORS

Per CORS,

pip install django-cors-headers 

e quindi la configurazione presente al INSTALLED_APPS, MIDDLEWARE_CLASSES e aggiungere il dominio frontend per CORS_ORIGIN_WHITELIST.

CORS_ORIGIN_WHITELIST = (
    'frontend.example.com' 
) 

CORS bloccherà qualsiasi richiesta http derivante da qualsiasi dominio diverso frontend.example.com


Per CSRF,

CSRF_COOKIE_DOMAIN = ".mydomain.com" 

e se si utilizza un App angolare, fare come sotto,

$httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
$httpProvider.defaults.withCredentials = true; 

e quindi aggiungere intestazioni mentre si effettua una richiesta http.

headers : { 
    "x-csrftoken" : $cookies.csrftoken 
}