Django:为什么CSRF_COOKIE在request.META

时间:2016-06-24 14:09:27

标签: django csrf django-csrf

我使用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? 欢迎任何评论。感谢

更新

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

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

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

模板标签的时间和方式如何?

1 个答案:

答案 0 :(得分:0)

这是一个标准的cookie Django应用程序为每个新用户启动,以防止Cross Site Forgery。

  

设置为随机值的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