Verboden (403) CSRF-verificatie mislukt. Verzoek afgebroken. Zelfs met het {% csrf_token %}

ik probeer in te loggen in django, maar ik krijg deze foutmelding, ik controleer de CSRF-documentatie en niets werkt voor mij.

Hier is de HTML:

<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>

Zoals je hierboven ziet, gebruik ik de {% csrf_token %} en heb ik ‘django.middleware.csrf.CsrfViewMiddleware’ in mijn ge├»nstalleerde apps.

En mijn mening is:

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')

ik stuur om naar een ander HTML-bestand waar ik de {% csrf_token %} niet gebruik.


Antwoord 1, autoriteit 100%

Theorie


Er zijn een aantal dingen vereist om de csrf-beveiliging te laten werken (bekijk de docs ):

  1. Uw browser moet cookies van uw server accepteren
  2. Zorg ervoor dat je ‘django.middleware.csrf.CsrfViewMiddleware' als middleware hebt opgenomen in je settings.py (of gebruik de decorateur csrf_protect() voor bepaalde weergaven die je wil beschermen)
  3. Zorg ervoor dat u het csrf-token van django.core.context_processors.csrf doorgeeft aan de contextmanager.

Als je je pagina laadt, kijk dan in de paginabron met je favoriete browser. Open niet het sjabloon html-bestand, open de url die verwijst naar de weergave die het formulier bevat. Kijk waar je de {% csrf_token %} hebt geplaatst. Als je iets ziet als

<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwolksqowkop2j3ofje" />

het zou goed moeten komen.

Als je daarentegen NOTPROVIDED ziet, is er iets misgegaan bij het maken van het csrf-token. Door in de broncode te kijken (context_processors.py en csrf.py), kunnen we achterhalen wat:

  • csrf(request) retourneert {'csrf_token': 'NOTPROVIDED'} als get_token(request) Geen retourneert.
  • get_token(request) retourneert request.META.get("CSRF_COOKIE", None).

Ik neem aan dat dit betekent dat het None retourneert als de cookie niet succesvol is gemaakt.

Oplossen


Voor jou betekent dit dat je eerst moet vervangen

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

met

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

We willen dat het csrf-veld zich in <form>...</form> bevindt, niet in <form>. Zoals de code op dit moment is, wordt deze geconverteerd naar

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

en we willen liever

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

Daarna – bekijk de broncode en kijk of je het csrf-veld kunt vinden. Als je het kunt zien, zou alles in theorie moeten werken.

U kunt ook controleren of de csrf-cookie in uw browser is ingesteld, b.v. Klik in Chrome met de rechtermuisknop op de webpagina en selecteer Insepect Element. Selecteer het tabblad Resources en klik op cookies. Je zou daar een cookienaam csrftoken moeten vinden.

Als u nog steeds problemen ondervindt, controleer dan de middleware-tuple in uw settings.py en controleer nogmaals of uw browser cookies van uw server accepteert zoals hierboven beschreven.


Antwoord 2, autoriteit 11%

Wis uw browsercache en probeer het opnieuw. Misschien gebruikt het de CSRF-token die is opgeslagen in de cache-cookie.


Antwoord 3

Met toevoeging van het bovenstaande antwoord, probeer de volgende regels toe te voegen in de weergaven

from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def somathing():
   return something

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes