Está expondo símbolo CSRF de proteção contra uma sessão segura?

votos
15

Django vem com middleware proteção CSRF , o que gera um símbolo exclusivo por sessão para uso em formulários. Faz a varredura de todas as recebidas POSTsolicitações 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 availabnle token de CSRF. As páginas não têm <form>elementos 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 gostaria /get-csrf-token/de retornar ao usuário de forma, contando com regras cross-site scripting do navegador para impedir que sites hostis do que o solicite.

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

Publicado 28/09/2008 em 00:11
fonte usuário
Em outras línguas...                            


3 respostas

votos
16

ATUALIZAÇÃO : 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 até mesmo solicitações de AJAX com o "X Solicitado-Com: XMLHttpRequest" deve agora ser protegido contra CSRF cabeçalho. Como resultado, o Django não isenta solicitações de Ajax de proteção CSRF .

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 cross-site solicitações de AJAX. Na verdade, o middleware Django CSRF agora isenta automaticamente solicitações de AJAX de CSRF digitalização de token .

Isto só é válido se você está realmente verificar as solicitações de AJAX reais X solicitadas-Com server-side cabeçalho para o valor "XMLHttpRequest" (que Django faz), e só isentar de digitalização CSRF.

Respondeu 10/02/2009 em 18:55
fonte usuário

votos
12

Se você sabe que vai precisar o token CSRF para solicitações de AJAX, você sempre pode incorporá-lo no HTML em algum lugar; 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.

Respondeu 28/09/2008 em 02:36
fonte usuário

votos
1

Anular isso, eu estava errado. (Veja comentários.) Você pode impedir a exploração, garantindo o seu JSON segue a especificação: Certifique-se sempre retornar um objeto literal 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ê retornar o token CSRF como JSON, um site malicioso poderia redefinir o construtor string ou array e solicitar o recurso.

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

Respondeu 28/09/2008 em 18:58
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more