django -> csrf konfigurieren

Django, Flask, Bottle, WSGI, CGI…
Antworten
alexPython
User
Beiträge: 52
Registriert: Donnerstag 7. April 2011, 13:26

Hallo, (Django 1.3)

ich habe eine post-form und muss die laut fehlermeldung gegen csrf-attacken schützen.
Ich habe mir dann die doku diesbezüglich durchgelesen und folgendes gemacht.

Code: Alles auswählen

from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def register(request):
    c = {}
    ....
    return render_to_response("register.html", {'var1': var1, 'var2': var2}, c, context_instance=RequestContext(request))
im register-template habe ich den token gesetzt mittels:

Code: Alles auswählen

<form action="/register/" method="post">{% csrf_token %}
die 'django.middleware.csrf.CsrfViewMiddleware' habe ich aus der settings.py entfernt.

ich bekomme die fehlerseite angezeigt:

Code: Alles auswählen

Forbidden (403)

CSRF verification failed. Request aborted.
Help

Reason given for failure:

    CSRF cookie not set.    
habe ich was übersehen?

Gruß
alexPython
User
Beiträge: 52
Registriert: Donnerstag 7. April 2011, 13:26

wie ist es mit den parametern

Code: Alles auswählen

return render_to_response("register.html", {'var1': var1, 'var2': var2}, c, context_instance=RequestContext(request))
was ist hier falsch?

Gruß
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

alexPython hat geschrieben:

Code: Alles auswählen

return render_to_response("register.html", {'var1': var1, 'var2': var2}, c, context_instance=RequestContext(request))
was ist hier falsch?
Das "c" passt nicht zur Signatur der Funktion: render_to_response(template[, dictionary][, context_instance][, mimetype])
alexPython
User
Beiträge: 52
Registriert: Donnerstag 7. April 2011, 13:26

und wie soll ich denn dann das beispiel in der doku verstehen?

Code: Alles auswählen

from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render_to_response("a_template.html", c,
                               context_instance=RequestContext(request))

alexPython
User
Beiträge: 52
Registriert: Donnerstag 7. April 2011, 13:26

ich habe es jetzt so:

Code: Alles auswählen

from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def register(request):
  ...
  return render_to_response("register.html", {'var1': var1, 'var2': var2}, context_instance=RequestContext(request))
und bekomme nun keine fehlermeldung mehr.

bin aber nun perplex, da das beispiel wie folgt aussieht:

Code: Alles auswählen

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render_to_response("a_template.html", c,
                               context_instance=RequestContext(request))

was soll das c hier bedeuten?

Gruß
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

In deinen angegebenen Codebeispielen hast du als zweiten Parameter jeweils ein Dictionary. Einmal explizit hingeschrieben und im anderen Fall an den Namen "c" gebunden.

Du würdest doch auch bei folgendem Code keine Unterschiede erwarten, oder?

Code: Alles auswählen

print 'bar'
und

Code: Alles auswählen

foo = 'bar'
print foo
alexPython
User
Beiträge: 52
Registriert: Donnerstag 7. April 2011, 13:26

phew!

alles klar, jetzt hab ich es!

danke
Antworten