我经常使用curl
测试我的应用程序,过去我只需要用csrf_exempt
封装我的观点。我真的不想这样做,因为我有一种讨厌的感觉,我会忘记在部署中这样做,享受一生的CSRF地狱。
我有办法使用Django的shell命令请求CSRF令牌吗?我希望获得一个令牌,我可以通过我的curl
请求安全地测试。
答案 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]>