Prima di tutto, grazie per la domanda interessante. Non conoscevo i dettagli di CSRF prima e ho dovuto cercare la risposta alla tua domanda, ma penso di conoscere la spiegazione corretta del comportamento di Django ora.
Gli sviluppatori di Django stanno trattando HTTP e HTTPS si riferisce in modo diverso perché gli utenti si aspettano cose diverse da servizi web sicuri e insicuri. Più specificamente, se una pagina web utilizza la sicurezza del livello di trasporto, gli utenti si aspettano di essere protetti dagli attacchi man-in-the-middle, nel senso che si fidano del principio che anche se qualcuno si sedesse direttamente tra loro e il server remoto e intercettasse ogni singolo messaggio, non potevano fare alcun uso di tali informazioni. Nota che questo non è previsto per connessioni HTTP semplici.
Considera ora il seguente scenario, citato dal post di un Django qui :
- user browses to http://example.com/
- a MITM modifies the page that is returned, so that is has a POST
form which targets https://example.com/detonate-bomb/ . The MITM has
to include a CSRF token, but that's not a problem because
he can invent one and send a CSRF cookie to match.
- the POST form is submitted by javascript from the user's browser
and so includes the CSRF cookie, a matching CSRF token and the
user's session cookie, and so will be accepted.
Non ho capito subito questo attacco da solo, quindi cercherò di spiegare i dettagli. Nota innanzitutto che stiamo esaminando una pagina che visualizza moduli su connessioni semplici ma invia dati tramite SSL / TLS. Parte del problema, a quanto ho capito, è che il cookie e il valore del modulo nascosto (ovvero "il token CSRF") vengono confrontati solo l'uno contro l'altro, non contro qualsiasi valore memorizzato sul lato server. Questo rende facile per l'attaccante fornire alla vittima una combinazione di token-cookie che sarà accettata dal server - ricorda, la pagina che mostra il modulo non è protetta, quindi% head_int% intestazioni e il contenuto del modulo stesso può essere falsificato Una volta inviato il modulo manipolato (tramite JS iniettato, ad esempio), il server vede una richiesta perfettamente valida.
L'aggiunta di rigoroso controllo Set-Cookie
è la risposta a questo esatto problema. Controllando queste intestazioni, solo le richieste provenienti da Referer
saranno accettate a un altro endpoint di https://example.com
. Le pagine non sicure dello stesso dominio verranno considerate completamente non attendibili e giustamente.
Ora per tornare alla domanda sul perché le semplici richieste HTTP siano trattate in modo diverso, dobbiamo solo immaginare un sito che non usa affatto la crittografia. In tal caso, un uomo nel mezzo potrebbe anche spoofare le intestazioni https://example.com
inviate con i dati del modulo effettivi, quindi controllare quelli non fornisce alcuna sicurezza aggiuntiva. In altre parole: non c'è protezione contro gli attacchi CSRF da parte di un uomo nel mezzo - ma, come ho detto prima, gli utenti non si aspettano questo tipo di sicurezza da semplici siti HTTP.
Per quanto riguarda la tua domanda su come altri framework web gestiscono questo vettore di attacco, devo dire onestamente che non lo so.