Frage

Während eine Anwendung zu testen ich in Django geschrieben habe, habe ich festgestellt, dass ich jedes Mal ein HTTP 403 Forbidden Fehler ich ein Formular einreichen geworfen bin. Ich bin mir bewusst, dass die CSRF-Middleware prüft, ob ein Cookie mit dem CSRF-Token - aber was soll mein Ansatz einen Benutzer gegeben werden, die Cookies deaktiviert hat

Muss ich zu überprüfen, ob der Benutzer diese Option in jedem meiner Ansichten aktiviert ist oder gibt es einen effizienteren Ansatz?

Vielen Dank im Voraus.

Diese Frage mit Django behandelt Pre-1.2 - die Lösung ist anders, wenn Sie eine ältere Version haben

.
War es hilfreich?

Lösung

Starten in Django 1.2 können Sie die 403-Antwort außer Kraft setzen mit CSRF_FAILURE_VIEW .

Andere Tipps

Nur für jeden, der das gleiche Problem hat: Ich fand, dass die am besten geeignete Lösung für mich einige Middleware wurde zu schreiben, die eine generische 403-Fehlerseite angezeigt werden:

from django.http import HttpResponseForbidden
from django.conf import settings

from django.template import RequestContext
from django.shortcuts import render_to_response

class PermissionErrorMiddleware(object):
    def process_response(self, request, response):
        if isinstance(response, HttpResponseForbidden):
            return render_to_response('403.html', context_instance=RequestContext(request)) 

        return response

Es weist den Benutzer, dass die wahrscheinlichste Ursache für die Fehlerseite ist, dass Cookies deaktiviert sind (unter anderem), weil meine Anwendung wirklich 403 Fehler nicht anders werfen. Ich habe immer den „Sicherheit durch Unklarheit“ Ansatz bevorzugt, und 404-Fehler ausgelöst wird, wenn ein Benutzer nicht eine bestimmte Seite zugreifen wird.

Wenn wirklich die Form ohne Cookies arbeiten müssen, ich glaube, Sie nur die CSRF-Middleware deaktivieren. Sie könnten in der Lage sein, etwas ähnliches mit zwei Formulareingaben zu implementieren, wo der Wert eines zufällig ist, und der andere ist ein Hash der Faust ein und ein Geheimnis.

Haben Sie versuchen csrf Informationen als ein verstecktes POST-Variable übergeben? In Projekten, die ich daran beteiligt war, ist in der Regel mit einem versteckten Eingang getan:

<input type="hidden" name="csrf" value="<?=$person->csrf?>" />

Sorry für PHP-Code, ich weiß nicht mehr, wie es in Django Vorlagen zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top