From 0a1af18047280e4b2cc89bf85c60a2ac5286fb04 Mon Sep 17 00:00:00 2001 From: Julio Biason Date: Tue, 5 Aug 2014 13:49:57 -0300 Subject: [PATCH] this should be good --- ajax-sosp-cors-csrf.html | 133 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) diff --git a/ajax-sosp-cors-csrf.html b/ajax-sosp-cors-csrf.html index b3932ab..cd8d2b4 100644 --- a/ajax-sosp-cors-csrf.html +++ b/ajax-sosp-cors-csrf.html @@ -205,6 +205,139 @@ CORS_ORIGIN_REGEX_WHITELIST = ( views.

+ +
+
+

Problema 2.5: URLs reversas

+
+ +
+

Para resolver URLs, usamos a tag {% url vew_id %} + para retornar a URL da view.

+ +

O problema é que é retornada a URL absoluta para a view, + sem considerar o domínio da view.

+
+ +
+


+<a href='/view/'>
+						

+ +

em http://outrosite.com vira + http://outrosite.com/view/.

+ +

Mas se a view estiver num domínio diferente, o mesmo + não é considerado.

+
+ +
+
    +
  • Se http://outrosite.com carregar o conteúdo + de http://api.outrosite.com
  • +
  • ... e http://api.outrosite.com tiver uma view + com URL absoluta /view/
  • +
  • ... o browser irá resolver como + http://outrosite.com/view/
  • +
  • ... quando deveria ser + http://api.outrosite.com/view/.
  • +
+
+ +
+

Solução: considerar que SITE_URL (do + settings.py) está correto e usar nas URLs.

+ +


+<a href='{{ settings.SITE_URL }}{% url "view_id" %}'>
+						

+
+
+ +
+
+

Problema 3: CSRF

+
+ +
+

Resumo:

+ +
    +
  • "csrftoken" é gerado na sessão do usuário.
  • +
  • Campo "csrftoken" é adicionado no form.
  • +
  • Quando o form retorna no POST, é verificado se é o + mesmo indicado na sessão do usuário.
  • +
+
+ +
+

Problema: Informações do token é passada num cookie.

+ +


+Set-Cookie: "csrftoken=t5HBi8EbkPk340nnpkdb8qxQsy2n8LwY;
+            expires=Tue, 04-Aug-2015 16:40:38 GMT; Max-Age=31449600; Path=/"
+						

+ +

Cookies não são processados durante requisições AJAX.

+
+ +
+

Solução correta:

+ +

Ao receber uma requisição AJAX, processar os headers também, + verificar a existência de "Set-Cookie", verificar se "csrftoken" + está na lista, guardar o valor e usar nas requisições seguintes.

+
+ +
+

Solução utilizada:

+ +


+from django.views.decorators.csrf import csrf_exempt
+
+@csrf_exempt
+def minha_view(request):
+    ....
+						

+
+
+ +
+
+

Problema 3.5: CSRF em Class Based Views

+
+ +
+


+class MinhaView(View):
+    @csrf_exempt
+    def post(self, request):
+        ....
+						

+ +

... não funciona.

+
+ +
+

É preciso aplicar decorators no dispatch da view:

+ +


+    @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        u"""Altera o dispatch para dispensar CSRF (por cauxa do AJAX)."""
+        return super(MinhaView, self).dispatch(*args, **kwargs)
+						

+
+
+ +
+

+
+ +
+ Dica: Evite ter objetos cortantes próximos quando estiver lidando + com AJAX/SOSP/CORS/CSRF. +