2012-11-26 17 views
31

Làm thế nào để bạn vượt qua một csrftoken với mô-đun python Yêu cầu? Đây là những gì tôi có, nhưng nó không làm việc, và tôi không chắc chắn mà tham số để vượt qua nó vào (dữ liệu, tiêu đề, auth ...)Truyền csrftoken bằng các yêu cầu python

import requests 
from bs4 import BeautifulSoup 

URL = 'https://portal.bitcasa.com/login' 

client = requests.session(config={'verbose': sys.stderr}) 

# Retrieve the CSRF token first 
soup = BeautifulSoup(client.get('https://portal.bitcasa.com/login').content) 
csrftoken = soup.find('input', dict(name='csrfmiddlewaretoken'))['value'] 

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken) 
r = client.post(URL, data=login_data, headers={"Referer": "foo"}) 

Cùng thông báo lỗi mỗi lần.

<h1>Forbidden <span>(403)</span></h1> 
<p>CSRF verification failed. Request aborted.</p> 
+0

'r.text' trả về là gì? Vẫn 'xác minh CSRF thất bại'? Tôi thấy biểu mẫu cũng có trường 'next' (mặc định là'/'), có thể cần thêm vào? Kiểm tra lại những gì được đăng khi bạn thực hiện thủ công. –

+0

@MartijnPieters yes 'Xác minh CSRF không thành công. Yêu cầu hủy bỏ.' – Jeff

+0

Làm theo cách thủ công, tôi thấy trường tiếp theo có/là tốt. – Jeff

Trả lời

49

Bạn cần phải thiết lập các giới thiệu vào các URL tương tự như trang đăng nhập:

import sys 
import requests 

URL = 'https://portal.bitcasa.com/login' 

client = requests.session() 

# Retrieve the CSRF token first 
client.get(URL) # sets cookie 
if 'csrftoken' in client.cookies: 
    # Django 1.6 and up 
    csrftoken = client.cookies['csrftoken'] 
else: 
    # older versions 
    csrftoken = client.cookies['csrf'] 

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken, next='/') 
r = client.post(URL, data=login_data, headers=dict(Referer=URL)) 
1

Tương tự như vậy, sử dụng csrf_client lưu ý django 's sự khác biệt chính là sử dụng csrftoken.value trong login_data. Được thử nghiệm với Django 1.10.5 -

import sys 

import django 
from django.middleware.csrf import CsrfViewMiddleware, get_token 
from django.test import Client 

django.setup() 
csrf_client = Client(enforce_csrf_checks=True) 

URL = 'http://127.0.0.1/auth/login' 
EMAIL= '[email protected]' 
PASSWORD= 'XXXX' 

# Retrieve the CSRF token first 
csrf_client.get(URL) # sets cookie 
csrftoken = csrf_client.cookies['csrftoken'] 

login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken.value, next='/') 
r = csrf_client.post(URL, data=login_data, headers=dict(Referer=URL))