2017-06-01 119 views
0

沒有csrf標記我得到一個403響應,所以它看起來像我需要它。目前我正在試圖做到這一點:如何獲取Django服務器的python POST請求的csrf標記

import requests 
import sys 

URL = 'http://127.0.0.1:8000/toasterinfo' 

client = requests.session() 

# Retrieve the CSRF token first 
client.get(URL) # sets cookie 
csrftoken = client.cookies['csrf'] 
r = client.post(URL, data={'number': 12524, 
    'type': 'issue', 'action': 'show', "csrfmiddlewaretoken": csrftoken}, headers=dict(Referer=URL)) 
print(r) 

但我得到一個錯誤:

Traceback (most recent call last): 
    File "django_client.py", line 10, in <module> 
    csrftoken = client.cookies['csrftoken'] 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cookies.py", line 327, in __getitem__ 
    return self._find_no_duplicates(name) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cookies.py", line 398, in _find_no_duplicates 
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) 
KeyError: "name='csrftoken', domain=None, path=None" 

我在做什麼錯?

回答

1

CSRF令牌是客戶端到服務器安全功能,以保護您的用戶免受跨站請求僞造。

你正在做一個服務器到服務器的請求,所以CSRF是無用的。您應該考慮刪除CSRF的要求,並使用適當的認證方法來處理服務器到服務器的請求。

您可以刪除您的視圖中使用以下裝飾器的CSRF令牌驗證。

@csrf_exempt

https://docs.djangoproject.com/en/dev/_modules/django/views/decorators/csrf/#csrf_exempt

基於令牌認證方法與HTTPS Connexion公司可能會適合你的情況。

0

這不是最安全的方法,但是您可以添加一個裝飾器到該視圖以排除CSRF驗證,並且您的POST不會失敗。

from django.views.decorators.csrf import requires_csrf_token 

@requires_csrf_token 
def your_view(request): 
    # your code... 

此解決方案僅適用於您瞭解除去CSRF驗證的風險。

+0

是的...我希望能夠保持CSRF驗證... – doubleOK

相關問題