通过 Python 登录网站 - 如何处理 CSRF?

Login to a website via Python - how to deal with CSRF?

我正在使用 Python 3 作为脚本来监视网页上用户个人资料的更新。该站点的登录受到 CSRF 反制措施的保护,这是一件好事。但是,我无法让我的脚本登录此站点。

在这两种情况下,我都得到了 403 的 HTTP 状态和 CSRF verification failed. Request aborted.

的消息

您只是在提交的表单中添加用户名和密码,您还需要添加 csrf 令牌字段。请参阅下文,我假设您可以找出字段名称和标记值。

form["username"] = 'username'
form["password"] = 'password'
form["csrffieldname"] = 'csrfvalue' # This is what you are missing

每个表单提交的令牌值都会不同,因此您必须获取表单并解析出 csrf 令牌值并在令牌超时到期之前提交。

我通过设置 Referer header.

robobrowser 变体起作用
browser.session.headers['Referer'] = base_url

所以对我有用的完整代码如下:

import re
from robobrowser import RoboBrowser

browser = RoboBrowser(history=True)
browser.open(base_url)
form = browser.get_form(action='/login/')

form["username"] = 'username'
form["password"] = 'password'
browser.session.headers['Referer'] = base_url

browser.submit_form(form)
print(str(browser.select))