【发布时间】:2012-11-14 02:04:54
【问题描述】:
如何通过 python 模块 Requests 传递 csrftoken?这就是我所拥有的,但它不起作用,我不确定将它传递给哪个参数(数据、标题、身份验证......)
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"})
每次都出现相同的错误消息。
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>
【问题讨论】:
-
r.text返回什么?还是CSRF verification failed?我看到表单还有一个next字段(默认为/),也许需要添加?仔细检查手动执行时发布的内容。 -
@MartijnPieters 是的
CSRF verification failed. Request aborted. -
手动做,我看到下一个字段也有/。
-
还发布了什么?只是
username、password、csrfmiddlewaretoken和next?或者还有其他领域吗?将next='/'添加到login_data字典时会发生什么? -
因为CSRF checking code 首先检查引用者,然后检查 CSRF 令牌。我认为错误消息是可见的,但除非服务器处于调试模式,否则它不会显示,这就是为什么代码不起作用的原因。然后我自己尝试了,看到同样的错误并返回到引用者,它必须与主机名匹配。
标签: python csrf python-requests