如何从命令行获取CSRF令牌?

时间:2013-11-07 02:56:15

标签: django django-csrf

我经常使用curl测试我的应用程序,过去我只需要用csrf_exempt封装我的观点。我真的不想这样做,因为我有一种讨厌的感觉,我会忘记在部署中这样做,享受一生的CSRF地狱。

我有办法使用Django的shell命令请求CSRF令牌吗?我希望获得一个令牌,我可以通过我的curl请求安全地测试。

3 个答案:

答案 0 :(得分:8)

向表单URL发出初始GET请求以填充cookie jar:

$ curl http://example.com/some-form/ -o /dev/null -c cookies.txt -s

获取csrftoken Cookie的值:

$ grep csrftoken cookies.txt | cut -f 7
YQkfXZCKtPP0hC30NmH10jSWuf6yJA5E

发布POST时,只需包含一个具有此值的csrfmiddlewaretoken字段(并使用相同的Cookie jar)。

我使用相同的技巧来编写使用requests库的端到端测试。

答案 1 :(得分:2)

你可以这样做

from django.middleware.csrf import _get_new_csrf_key()
request.META["CSRF_COOKIE"] = _get_new_csrf_key()

答案 2 :(得分:0)

在处理与此相关的问题时,我想测试为一堆可通过AJAX访问的端点设置CSRF令牌。我遇到了这个帖子,并认为从Django shell添加另一种方法可能是值得的,这就是原始海报似乎要问的问题。

首先,我正在使用requests库,所以如果你没有,你必须pip install requests

确保令牌存在

接下来,如果仅处理Ajax端点,我们需要某种方法来检索令牌,因此视图的get方法必须设置以下装饰器,因为as mentioned in the Django docs令牌不会被设置如果你动态生成表单。这是一个基于类的视图示例:

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import ensure_csrf_cookie

    @method_decorator(ensure_csrf_cookie)
    def get(self, request, *args, **kwargs):
        return SomeJson...

DRF Post:确保csrf_protect

我也在使用Django Rest Framework视图,因此我必须在POST上显式设置csrf_protect

from django.views.decorators.csrf import csrf_protect

    @method_decorator(ensure_csrf_cookie)
    def post(self, request, *args, **kwargs):
        return SomeJson...

从shell检索令牌并将其重新发回

最后,要从get方法获取令牌并将其重新发送回post方法,我执行了以下操作:

>>> resp = requests.get(url)
>>> cookies = resp.cookies
>>> token = cookies['csrftoken']
>>> data = {'content': True, 'we': None, 'are': False, 'posting': 0}
>>> data['csrfmiddlewaretoken'] = token
>>> resp2 = requests.post(url, data=data, cookies=cookies)
>>> resp2
<Response [200]>