5

我经常使用测试我的应用程序curl,过去我不得不简单地用csrf_exempt. 我真的不想这样做,因为我有一种讨厌的感觉,我会忘记在部署中这样做并享受一生的 CSRF 地狱。

有没有办法让我使用 Django 的 shell 命令请求 CSRF 令牌?我想获得一个令牌,我可以将我的请求与我的curl请求一起发送以安全地测试事物。

4

3 回答 3

12

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

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

获取csrftokencookie 的值:

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

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

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

于 2013-11-07T03:23:11.713 回答
2

你可以这样做

from django.middleware.csrf import _get_new_csrf_key()
request.META["CSRF_COOKIE"] = _get_new_csrf_key()
于 2013-11-07T03:07:32.147 回答
0

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

首先,我正在使用requests图书馆,所以如果你没有它,你必须这样做pip install requests

确保令牌存在

接下来,如果只处理 Ajax 端点,我们需要某种方式来检索令牌,因此您的视图的 get 方法必须具有以下装饰器集,因为如 Django 文档中所述,如果您是动态生成表单。这是一个基于类的视图示例:

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 帖子:确保 csrf_protect

我也在使用 Django Rest Framework 视图,所以我必须csrf_protect在我的 POST 上明确设置:

from django.views.decorators.csrf import csrf_protect

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

从 shell 中检索令牌并将其返回

最后,为了从方法中获取令牌get并将其 POST 回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]>
于 2015-06-24T16:52:05.313 回答