python - 使用 python 请求传递 csrftoken

标签 python csrf python-requests

如何通过 python 模块 Requests 传递 csrftoken?这就是我所拥有的,但它不起作用,我不确定将它传递给哪个参数(数据、 header 、身份验证...)

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>

最佳答案

如果您要设置引荐来源网址,那么对于该特定网站,您需要将引荐来源网址设置为与登录页面相同的 URL:

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))

当使用不安全的 http 时,Referer header 通常会被过滤掉,否则很容易被欺骗,因此大多数网站不再需要设置 header 。但是,当使用 SSL 连接时,如果它已设置,则站点验证它是否至少引用了逻辑上可能发起请求的内容是有意义的。 Django 在加密连接时执行此操作(使用 https://),然后主动要求它。

关于python - 使用 python 请求传递 csrftoken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13567507/

相关文章:

python - 如何在 PyPI 上提出新的 trove 分类器

python - 查找 numpy 数组的所有 n 组(对、三元组、四元组等)

node.js - 使用csrf(express + node)时禁止访问

java - Spring 安全 CSRF : How to retrieve token in Java

Python 请求在 cookie 中失败整数

python - 迭代 wxPython 中的控件以保存 session 数据

python 解析制表符分隔的文件

javascript - AngularJS 身份验证和基于 XSRF token

python - 使用 requests.post 时 <a> 标签不显示 Href 属性

Python 请求错误 10060