【问题标题】:Django rejects Requests' CSRF TokenDjango 拒绝请求的 CSRF 令牌
【发布时间】:2014-08-10 13:15:33
【问题描述】:

我正在用 python 的 Request 库向 django 后端写一篇 Ajax 帖子

代码:

import requests
import json
import sys

URL = 'http://localhost:8000/'

client = requests.session()

client.get(URL)

csrftoken = client.cookies['csrftoken']


data = { 'file': "print \"It works!\"", 'fileName' : "JSONtest", 'fileExt':".py",'eDays':'99','eHours':'1', 'eMinutes':'1' }
headers = {'Content-type': 'application/json',  "X-CSRFToken":csrftoken}
r = requests.post(URL+"au", data=json.dumps(data), headers=headers)

Django 给我一个 403 错误,指出 CSRF 令牌未设置,即使来自 csrf_failure() 的 request.META 显示它已设置。是我遗漏了什么还是我没有发现一个愚蠢的错误?

【问题讨论】:

    标签: python django csrf python-requests


    【解决方案1】:

    我问了我的朋友,他发现了问题,基本上你每次发出请求时都必须发送 django 给你的 cookie。

    更正:

    cookies = dict(client.cookies)
    r = requests.post(URL+"au", data=json.dumps(data), headers=headers,cookies=cookies)
    

    【讨论】:

      【解决方案2】:

      您需要将引用者传递给标头,来自 django 文档:

      另外,对于 HTTPS 请求,严格的 referer 检查是由 CsrfView 中间件。这是解决中间人问题所必需的 使用独立于会话时在 HTTPS 下可能发生的攻击 nonce,因为 HTTP 的“Set-Cookie”标头是 (不幸的是)被正在与网站交谈的客户接受 HTTPS。 (未对 HTTP 请求进行引用检查,因为 在 HTTP 下,Referer 标头的存在不够可靠。)

      所以改变这个:

      headers = {'Content-type': 'application/json',  "X-CSRFToken":csrftoken, "Referer": URL}
      

      【讨论】:

      • 我添加了这条线,遗憾的是它仍然不起作用。它仍然给我“未设置 CSRF cookie”。错误。
      • 您是否更改了 CSRF_COOKIE_SECURE 设置? docs.djangoproject.com/en/dev/ref/settings/#csrf-cookie-secure
      • 也尝试将X-CSRFToken 更改为csrfmiddlewaretoken
      • 是的,我检查了所有这些东西,我的朋友回答帮助我解决了这个问题,我已经在上面发布了答案。无论如何感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 2017-12-19
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2013-09-18
      • 2021-12-28
      相关资源
      最近更新 更多