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

CSRF失败:CSRF令牌丢失或不正确

陈刚洁
2023-03-14
问题内容

我正在使用Django 1.7和django-rest-framework。

我制作了一个API,该API返回了一些JSON数据,并将其放入了我的 settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.AllowAny',),
    'DEFAULT_RENDERER_CLASSES': (
    #   'rest_framework.renderers.XMLRenderer',
    'rest_framework.renderers.JSONRenderer',
    #   'rest_framework.renderers.BrowsableAPIRenderer',
    )
}

当我进行GET调用时,它将返回我所有的数据,但是当我尝试使用PUT / PATCH时,我得到:

--------Response Headers---------
Status Code: 403
Date: Wed, 29 Oct 2014 18:51:42 GMT
Vary: Cookie
Server: WSGIServer/0.1 Python/2.7.8
Allow: GET, POST, PUT, PATCH, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Type: application/json
---------------------------------

--------Response Body-----------
{"detail": "CSRF Failed: CSRF token missing or incorrect."}
---------------------------------

仅当我登录时才会发生这种情况,如果我是匿名用户,则可以正确进行PUT / PATCH。

我尝试过@csrf_exempt,但遇到错误,我rest_framework.permissions.AllowAny将设置包括在内…

我不知道是怎么回事。有人知道这个问题是什么吗?


问题答案:

使用SessionAuthentication时,你使用的是Django的身份验证,通常需要检查CSRF。Django REST Framework仅针对强制执行此操作,SessionAuthentication因此你必须在X-CSRFToken标头中传递CSRF令牌。

在Django文档提供了检索CSRF令牌使用jQuery和请求发送它的更多信息。CSRF令牌另存为一个cookie csrftoken,你可以从HTTP响应中检索该cookie,该cookie 随所使用的语言而异。

如果你无法检索CSRF cookie,通常表明你不应该使用SessionAuthentication。我建议根据你的需要研究TokenAuthentication或OAuth 2.0。



 类似资料:
  • 问题内容: 在这里是Django的初学者,我已经尝试了很长时间了。我的中间件类中确实有“ django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子中确实有令牌。 这是我的代码,我在做什么错? 这是我的模板: 问题答案: 你应该使用自动使用的快捷功能 使用https://docs.djangoproject.com/en/2.2/topics/http/sh

  • 问题内容: 我有Django的1.3版。我尝试按照其他人的问题指定localhost:8000,但这对我不起作用。我正在尝试使用文件上传表单,但是我收到一个错误,即form.py没有CSRF令牌。 form.py: views.py: upload.html: 我很沮丧,请告诉我一些尝试的方法。谢谢 问题答案: 你需要传递 为此:(views.py) 这会将csrf的令牌传递到模板。

  • 问题内容: 我尝试发布参数像 但是, 我正在使用Django返回,找不到在不影响安全性的情况下如何防止此问题。 问题答案: 你可以通过两种不同的方式发出AJAX发布请求: 告诉你的视图不要检查csrf令牌。这可以通过使用decorator来完成,如下所示: 要将csrf令牌嵌入每个AJAX请求中,对于jQuery,它可能是: 该getCookie函数从cookie检索csrf令牌的位置。我使用以下

  • 问题内容: 希望有人向我展示如何使用Django REST框架使用JSON发出简单的POST请求。我在本教程中的任何地方都看不到任何示例吗? 这是我要发布的角色模型对象。这是一个全新的角色,我想添加到数据库中,但出现500错误。 这是我在bash终端提示符下的curl请求: 网址 DOES可以处理GET请求,并且我可以下拉数据库中的所有角色,但是似乎无法创建任何新的Roles。我没有权限设置。我在

  • 问题内容: 尝试从教程中制作简单表格时,我收到CSRF验证失败的消息。我对CSRF验证实际上是什么进行了一些研究,据我所知,要使用CSRF验证,你需要在html中使用其中的csrf_token标记之一,但是我没有 这是我的模板: 相当简单,位于contact.html 这是我的urlconf:从 应用程序名称为testapp1。当我键入URL(http:// localhost:8000 / te

  • 本页描述了解释CSRF攻击的用例(16.1): https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html 但是,如果用户确实登录了银行的网站,那么邪恶的网站难道不可能发出GET请求以获取新的CSRF令牌,并在根本不需要用户的情况下撰写帖子吗? 答案必须是否定的,否则CSRF令牌将毫无用处,但我