Pergunta

Django vem com CSRF proteção middleware, que gera um por sessão símbolo exclusivo para uso em formulários. Faz a varredura de todos os pedidos POST de entrada para o token correto, e rejeita o pedido se o token está ausente ou inválido.

Eu gostaria de usar AJAX para algumas solicitações POST, mas disse que os pedidos não têm o CSRF token de availabnle. As páginas não têm elementos <form> para ligar para e eu prefiro não turvar-se a marcação de inserir o token como um valor oculto. Eu acho que uma boa maneira de fazer isso é para expor um vew como /get-csrf-token/ para retornar o token do utilizador, com base em regras de cross-site scripting do navegador para impedir que sites hostis do que o solicite.

Esta é uma boa ideia? Existem melhores formas de proteger contra ataques CSRF e ainda permite que solicitações de AJAX?

Foi útil?

Solução

Se você sabe que vai precisar da CSRF token para solicitações de AJAX, você sempre pode incorporá-lo no lugar HTML; então você pode encontrá-lo através de Javascript atravessando o DOM. Dessa forma, você ainda terá acesso ao token, mas você não está expondo-lo através de uma API.

Para colocar de outra forma: fazê-lo através de modelos do Django - não através do despachante URL. É muito mais seguro desta forma.

Outras dicas

Atualizar : O abaixo era verdade, e deve ser verdade se todos os navegadores e plugins foram devidamente implementadas. Infelizmente, sabemos agora que eles não são, e que certas combinações de plugins do navegador e redireciona pode permitir que um invasor para fornecer cabeçalhos arbitrários sobre um pedido cross-domain. Infelizmente, isso significa que as solicitações AJAX, mesmo com o "X Solicitado-Com: XMLHttpRequest" cabeçalho deve agora ser CSRF-protegida. Como resultado, Django não isenta mais solicitações de Ajax de CSRF proteção .

Resposta Original

Vale a pena mencionar que a proteção solicitações de AJAX de CSRF é desnecessária, uma vez que os navegadores não permitem solicitações de AJAX cross-site. De fato, o Django CSRF middleware agora isenta automaticamente solicitações de AJAX de CSRF token de digitalização .

Esta é apenas válida se você está realmente verificar os pedidos reais AJAX-X pediu-Com server-side cabeçalho para o valor "XMLHttpRequest" (que Django faz), e apenas a isenção de digitalização CSRF.

Cancelar isso, eu estava errado. (Veja comentários.) Você pode prevenir a exploração, garantindo o seu JSON segue a especificação: Certifique-se sempre retornar um literal objeto como o objeto de nível superior. (Eu não posso garantir que não haverá mais façanhas. Imagine um navegador que dá acesso ao código falhou em seus eventos window.onerror!)

Você não pode confiar em regras cross-site-scripting para manter respostas AJAX privado. Por exemplo, se você devolver o CSRF token como JSON, um site malicioso poderia redefinir a string ou construtor array e solicitar o recurso.

bigmattyh está correto: Você precisa incorporar o em algum lugar token na marcação. Alternativamente, você pode rejeitar quaisquer posts que do Tenha um referer que não jogo. Dessa forma, apenas pessoas com firewalls de software excesso de zelo será vulnerável a CSRF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top