【问题标题】:how can I provide csrf protection in case of using requests module to post data to a django view在使用请求模块将数据发布到 django 视图的情况下,如何提供 csrf 保护
【发布时间】:2016-03-13 11:59:36
【问题描述】:

我有一个modelForm如下:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = FileUploads
        fields = ['uploads']

和这样的视图:

@csrf_exempt
def upper(request):
    form = UserProfileForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        form.save()
        return HttpResponse(status=200)
    return HttpResponse(status = 403)

我有一个简单的脚本可以将多部分/编码文件发送到视图,如下所示:

import requests
f = open('C:\\Users\\myname\\Desktop\\image.jpg', 'rb')
urls='http://localhost:8000/upper'
r=requests.post(urls, files= {'uploads':f})
print(r.status_code)

我的问题是:只要我在接收视图上方有 csrrf_exempt 装饰器,一切正常,这对于测试环境来说很好。但是如果我想要 csrf 保护呢?考虑到我正在使用 requests 模块,我该如何提供 csrf 令牌?

【问题讨论】:

    标签: python django csrf


    【解决方案1】:

    你需要传递一个cookie和一个具有相同值的header:

    import requests
    f = open('C:\\Users\\myname\\Desktop\\image.jpg', 'rb')
    urls='http://localhost:8000/upper'
    cookies = {'csrftoken': 'token'}
    headers = {'X-CSRF-TOKEN': 'token'}
    r=requests.post(urls, files={'uploads':f}, cookies=cookies, headers=headers)
    print(r.status_code)
    

    token 的值无所谓,可以取任意字面量,只要相同即可。

    【讨论】:

    • 是的,这是安全的。如果另一个网站可以(ab)使用您的会话(例如 evil.com 上提交给您网站的表单),您需要一个加密安全令牌,但这里不是这种情况。在这里,您可以完全控制整个会话,因此任何令牌都是安全的。
    猜你喜欢
    • 2012-07-07
    • 2020-06-07
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多