【问题标题】:CSRF protection to a view with a download api request使用下载 api 请求对视图进行 CSRF 保护
【发布时间】:2020-06-07 22:05:24
【问题描述】:

我的应用程序中有这个视图,它调用 api 来下载 pdf:

@login_required
def generateContractPdf(request):
   file_id = request.POST.get('contract')  
   contract_id = request.POST.get('contract')    
   payload = {"file_id": file_id}
   data = {"data": json.dumps(payload, default=str)}
   headers = {'content-type': 'application/json'}
   brokkr = os.environ.get("BROKKR_ADDRESS", default='localhost')
   response = requests.post('http://'+brokkr+':5000/contract', params=data, headers=headers)

   filename=str(contract_id)+".pdf"
   response = HttpResponse(response.content, content_type='application/pdf')
   response['Content-Disposition'] = 'attachment; filename="'+filename+'"'

   return response

但我刚刚意识到,如果我不使用 render(),csrf 就不起作用,所以这个视图可能会被利用。

我怎样才能改变它以保持这种保护?

【问题讨论】:

    标签: python django rest csrf


    【解决方案1】:

    您可以将csrf_protect 装饰器应用到您的视图上,以保护 CsrfViewMiddleware 到一个视图。

    from django.views.decorators.csrf import csrf_protect
    
    @csrf_protect
    def generateContractPdf(request):
        --- Your logic ---
    

    【讨论】:

    • OP 询问如何保持 CSRF 保护。 csrf_exempt 装饰器禁用它。
    • 我认为这与我想做的相反。我想使用我在表单中发送的 csrf 令牌,即使它不使用 render() 来返回答案
    • 我编辑了我的答案,请检查它,如果它不起作用,请在此处发表评论。 :)
    猜你喜欢
    • 2022-10-17
    • 2012-03-15
    • 2015-10-15
    • 2019-01-25
    • 2016-09-21
    • 2012-11-01
    • 2014-02-19
    • 2015-10-06
    • 2011-01-21
    相关资源
    最近更新 更多