当前位置: 首页 > 面试题库 >

禁止(403)CSRF验证失败。请求中止。即使使用{%csrf_token%}

傅和璧
2023-03-14
问题内容

禁止(403)CSRF验证失败。请求中止。即使使用{%csrf_token%}我正在尝试在django中进行登录,但出现此错误,我检查了CSRF文档,但对我来说没有任何用处。

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

就像你在上面看到的那样,我使用了{%csrf_token%},并且在已安装的应用程序中有“ django.middleware.csrf.CsrfViewMiddleware”。

我的看法是:

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

我重定向到另一个我不使用{%csrf_token%}的HTML文件。


问题答案:

Theory
要使csrf保护起作用,需要做一些事情(请查看docs):

  1. 你的浏览器必须接受服务器中的Cookie
  2. 确保已将' django.middleware.csrf.CsrfViewMiddleware'作为中间件包含在中间settings.py(或者在要保护的特定视图上使用装饰器csrf_protect()
  3. 确保将csrf令牌从django.core.context_processors.csrf传递给上下文管理器。
    加载页面时,请使用喜欢的浏览器查看页面源。不要打开模板html文件,打开指向包含表单的视图的URL。看看你放在哪里{% csrf_token %}。如果看到类似
<input type='hidden' name='csrfmiddlewaretoken' value="jdwjwjefjwdjqwølksqøwkop2j3ofje" />

你应该没事的。

另一方面NOTPROVIDED,如果你看到,则在创建csrf令牌时出现了问题。通过查看源代码(context_processors.pycsrf.py),我们可以发现:

  • csrf(request)回报{'csrf_token': 'NOTPROVIDED'},如果get_token(request)回报无。
  • get_token(request)返回request.META.get("CSRF_COOKIE", None)

我认为这意味着None如果未成功创建cookie ,它将返回。

Fix
对你来说,这意味着你应该先更换

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

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

我们希望csrf字段位于内部<form>...</form>,而不是内部<form>。由于目前的代码是,它将被转换为

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

我们希望

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

之后-查看源代码,看看是否可以找到csrf字段。如果你能看到它,那么一切都应该在理论上起作用。

你还可以检查浏览器(例如Chrome)中是否设置了csrf cookie,右键单击网页,然后选择Insepect Element。选择Resources选项卡,然后单击cookie。你应该在csrftoken那里找到一个cookie名称。

如果仍然有问题,请仔细检查你的中间件元组,settings.py并如上所述检查浏览器是否接受来自服务器的cookier。



 类似资料:
  • 问题内容: 我尝试建立一个非常简单的网站,在该网站中可以将数据添加到sqlite3数据库中。我有两个文本输入的POST表单。 index.html: forms.py: views.py: 但是,当我单击“提交”按钮时,出现403错误: 我已经包含{% csrf_token %}在index.html中。但是,如果这是一个RequestContext问题,我真的不知道在哪里以及如何使用它。我希望所

  • 问题内容: 我正在关注Django 1.3 Web开发。对于登录,我收到以下错误 这是我的settings.py随附的APPS。这正是书上所说的样子。 这本书说,它应该包含django.contrib.auth.views.login ..并且我将其包含在 和我的registration / login.html …复制自本书的副本。它应该做。 问题答案: 你需要将模板标记添加为Django模板中

  • 问题内容: 我最近尝试使用Apache设置测试服务器。该站点必须在domain下运行。我总是会出错。我使用的是Ubuntu 10.10服务器版本。doc根目录在dir下。以下是我的设置: / var / www的内容 服务器上主机文件的内容(IP 192.168.2.5) 网站配置 我的文档根目录中没有文件。权限设置正确(可通过www-data读取)。 如果我从桌面输入IP地址,则该站点将正确显示

  • 第一次投递到stackoverflow。 我只是试图使用jQuery从json url获取数据。第一个问题是跨源请求块,即使库应该停止这个问题,像ajax跨源js(抱歉不提供这个链接,我太新了,在这里有超过2个链接),我仍然没有运气,一样交叉原点错误。 所以我搬到了JSONP。 (我也尝试过JSONP请求的AJAX语法) 现在我可以在网络选项卡中看到数据正在返回,但状态是403禁止。chrome网

  • 对localhost的Ajax请求返回403错误。然而,当我更改controller requestMethod以获取并在浏览器上打开请求“url”时,它会显示从服务器返回的json数据。我希望使用这些数据填充一个下拉列表。请帮帮我。我正在使用spring security 4.0和spring MVC框架。CSRF未禁用。此外,该url在Spring得到保护。 我在这里查看了相关问题,但没有找到

  • 因此,我计划在我的网站中实现CSRF,并设置所需的内容,我认为我设置正确,但仍然存在ajax提交表单的问题。 这就是我在配置中的内容,在配置中我设置了以防止每次提交时的重新生成(基于此讨论Ajax CSRF 403禁止的codeigniter)。 而我的表单,我没有使用html表单标记,而是使用和。 Ajax提交表单: PHP函数 如果我将ajax类型更改为,它可以工作,但不能工作。如果从控制台查