Sektionen
Benutzerspezifische Werkzeuge
Sie sind hier: Startseite Support Dokumentation docs Pyramid: CSRF-Protection mit Deform

Pyramid: CSRF-Protection mit Deform

Pyramid bietet mit session.get_csrf_token() eine Methode an, die einen Token für die aktuelle Session erzeugt. Diese kann in einem verstecktem Formularfeld mit übergeben werden, um es später daraufhin zu überprüfen und so eine CSRF-Protection zu realisieren.

CSRF_TOKEN in das Formular einfügen

Wir fügen als erstes den von session.get_csrf_token() bereitgestellten csrf_token in das Formular ein. Eine sehr einfache Möglichkeit stellt, das anhängen des tokens an die formid dar.

add_profile_form = Form(schema, buttons=('submit',),
               formid="deform-%s" % request.session.get_csrf_token())

Request auf CSRF_TOKEN prüfen

Die Methode check_csrf prüft, ob der an die formid angehängte csrf_token mit dem aktuellen Token in der Session (request.session.get_csrf_token()) übereinstimmt.

def check_csrf(request):
""" for any request that has a POST, make sure the CSRF is valid
"""
token = request.session.get_csrf_token()
formid = request.POST.get('__formid__')
csrf_token = formid.split('-')[-1]
if request.session.get_csrf_token() == str(csrf_token):
log.debug("CSRF in POST matches session token")
return True
else:
log.warn("Form POST without CSRF! %s from %s"
% (request.url, request.remote_addr))
return False
def check_request_for_csrf(event):
if event.request.POST and not check_csrf(event.request):
raise HTTPForbidden("Token mismatch; bad request")

Wir registrieren nun einen EventHandler, welcher auf NewRequest reagiert und die methode check_request_for_csrf aufruft.

config.add_subscriber(check_request_for_csrf, NewRequest)

Der EventHandler prüft ob POST-Daten im Request vorhanden sind und ruft die Methode check_csrf auf. Wenn check_csrf False zurück gibt, wird eine HTTPForbidden Exception geworfen und der Nutzer bekommt eine Fehlermeldung.