it-swarm.com.de

Verboten (403) Die CSRF-Überprüfung ist fehlgeschlagen. Anfrage abgebrochen. Auch mit {% csrf_token%}

ich versuche, mich in Django anzumelden, aber ich erhalte diese Fehlermeldung. Ich überprüfe die CSRF-Dokumentation und nichts funktioniert für mich.

Hier ist der HTML-Code:

<body>
  <section class="container">
    <div class="login">
      <h1>Login to Web App</h1>

      {% if form.errors %}
        <p class="error">Lo sentimos, la combinacion de usuario y contrasena no es correcta!</p>
      {% endif %}  

      <form action="/accounts/auth/" method="post">
      {% csrf_token %}  
      <input type='hidden' name='csrfmiddlewaretoken' value='randomchars'/>

        <p><input name="username" type="text" name="login" value="" placeholder="Username"></p>

        <p><input name="password" type="password" name="password" value="" placeholder="Password"></p>

        <p class="submit"><input type="submit" name="commit" value="Login"></p>
      </form>
    </div>
</body>

Wie Sie oben sehen, verwende ich {% csrf_token%} und habe in meinen installierten Apps 'Django.middleware.csrf.CsrfViewMiddleware'.

Und meine Ansichten sind:

from Django.http import HttpResponse,HttpResponseRedirect
from Django.template.loader import get_template 
from Django.template import Context
from datetime import datetime
from Django.shortcuts import render_to_response
from Django.http import HttpResponseRedirect
from Django.contrib import auth
from Django.core.context_processors import csrf

from models import *
from Django.shortcuts import get_object_or_404
from forms import *
from Django.template.context import RequestContext
from Django.contrib.auth.decorators import login_required
from Django.contrib.auth import authenticate, login

def login(request):
    c = {}
    c.update(csrf(request))
    return render_to_response('login.html', c)    


def auth_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        auth.login(request.user)
        return HttpResponse('/accounts/loggedin') 
    else:
        return HttpResponse('/accounts/invalid')

ich leite zu einer anderen HTML-Datei um, in der ich nicht {% csrf_token%} verwende.

16
BismarthSantana

Theorie


Damit der csrf-Schutz funktioniert, müssen Sie ein paar Dinge tun (siehe docs ):

  1. Ihr Browser muss Cookies von Ihrem Server akzeptieren
  2. Vergewissern Sie sich, dass Sie Django.middleware.csrf.CsrfViewMiddleware' als Middleware in Ihrem settings.py enthalten haben (alternativ verwenden Sie den Dekorator csrf_protect () für bestimmte Ansichten, die Sie schützen möchten.)
  3. Stellen Sie sicher, dass Sie das csrf-Token von Django.core.context_processors.csrf an den Kontextmanager übergeben.

Wenn Sie Ihre Seite laden, werfen Sie einen Blick in die Seitenquelle mit Ihrem bevorzugten Browser. Öffnen Sie die HTML-Vorlagendatei nicht. Öffnen Sie die URL, die auf die Ansicht verweist, die das Formular enthält. Schau dir an, wo du den {% csrf_token %} platziert hast. Wenn Sie so etwas sehen 

<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwølksqøwkop2j3ofje" />

du solltest in Ordnung sein. 

Wenn Sie dagegen NOTPROVIDED sehen, ist beim Erstellen des csrf-Tokens ein Fehler aufgetreten. Durch einen Blick in den Quellcode (context_processors.py und csrf.py) können wir herausfinden, was:

  • csrf(request) gibt {'csrf_token': 'NOTPROVIDED'} zurück, wenn get_token(request) Keine angibt. 
  • get_token(request) gibt request.META.get("CSRF_COOKIE", None) zurück. 

Ich gehe davon aus, dass dies None zurückgibt, wenn das Cookie nicht erfolgreich erstellt wurde. 

Fix


Für Sie bedeutet das, dass Sie zuerst ersetzen sollten 

<form action="/accounts/auth/" method="post" {% csrf_token %}>

mit

<form action="/accounts/auth/" method="post">
{% csrf_token %}
(...)
</form>

Wir möchten, dass sich das Feld "csrf" in <form>...</form> und nicht in in<form> befindet. Da der Code momentan vorliegt, wird er in konvertiert

<form action="/accounts/auth/" method="post" <input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />>

und wir möchten lieber

<form action="/accounts/auth/" method="post">
<input type='hidden' name='csrfmiddlewaretoken' value='randomchars' />

Schauen Sie sich danach den Quellcode an und sehen Sie, ob Sie das Feld "csrf" finden können. Wenn Sie es sehen können, sollte alles theoretisch funktionieren.

Sie können auch überprüfen, ob das csrf-Cookie in Ihrem Browser gesetzt wurde, z. Klicken Sie in Chrome mit der rechten Maustaste auf die Webseite und wählen Sie Insepect Element aus. Wählen Sie die Registerkarte Resources und klicken Sie auf Cookies. Dort sollten Sie einen Cookie-Namen csrftoken finden.

Wenn Sie immer noch Probleme haben, überprüfen Sie den Middleware-Tuple in Ihrem settings.py und überprüfen Sie, ob Ihr Browser einen Cookie von Ihrem Server akzeptiert, wie oben beschrieben.

19
Steinar Lima

Löschen Sie Ihren Browser-Cache und versuchen Sie es erneut. Möglicherweise verwendet es das in einem zwischengespeicherten Cookie gespeicherte CSRF-Token.

1