【问题标题】:Django: why CSRF_COOKIE in request.METADjango:为什么在 request.META 中使用 CSRF_COOKIE
【发布时间】:2016-10-27 04:38:51
【问题描述】:

我使用requests 发送请求。

import requests

def print(req):
    print('{}\n{}\n{}\n\n{}'.format(
        '-----------START-----------',
        req.method + ' ' + req.url,
        '\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()),
        req.body,
    ))
    print "----------END------------"

try:
    req = requests.Request('GET',
            'https://myip/myproject/upload/token',
            headers={'Authorization': 'Token 401f7ac837a',
            })
    prepared = req.prepare()
    print(prepared)
except Exception as e:
    print "Exception:", e

输出:

-----------START-----------
GET https://myip/myproject/upload/token
Authorization: Token 401f7ac837a

None
----------END------------

但是在我打印了request.META之后,就有了

META:{u'CSRF_COOKIE': u'YGzoMaNEQJz1Kg8yXAwjJt6yNuT9L'

什么设置了 CSRF_COOKIE? 欢迎任何 cmets。谢谢

更新

(1) 从doc,它说This cookie is set by CsrfViewMiddleware,这意味着CSRF cookie设置在后端并在响应中设置为前端(CSRF cookie:服务器->浏览器)。为什么它还说对于所有未使用 HTTP GET、HEAD、OPTIONS 或 TRACE 的传入请求,必须存在 CSRF cookie?为什么它会出现在我的 request.META 中? (CSRF cookie:浏览器 -> 服务器???)

(2) 它说**在所有传出的 POST 表单中都存在一个名为“csrfmiddlewaretoken”的隐藏表单字段。该字段的值为 CSRF cookie 的值。

这部分由模板标签完成。 **

模板标签何时以及如何做到这一点?

【问题讨论】:

    标签: django csrf django-csrf


    【解决方案1】:

    这是 Django 应用程序为每个新用户启动的标准 cookie,以防止跨站点伪造。

    设置为随机值的 CSRF cookie(独立于会话 nonce,因为它被称为),其他网站将无法访问。

    此 cookie 由 CsrfViewMiddleware 设置。本来就是永久的, 但是由于没有办法设置一个永不过期的cookie,它是 与已调用的每个响应一起发送 django.middleware.csrf.get_token() (内部使用的函数 检索 CSRF 令牌)。

    出于安全原因,CSRF cookie 的值每次都会更改 用户登录的时间。

    更多阅读

    https://docs.djangoproject.com/en/1.9/ref/csrf/#how-it-works

    【讨论】:

    • 谢谢。什么生成和设置 CSRF_COOKIE?
    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2022-12-22
    • 2013-07-03
    • 2019-10-03
    • 2020-06-26
    • 2017-08-10
    • 1970-01-01
    相关资源
    最近更新 更多