通过Python登录网站-如何处理CSRF?
我正在使用Python3编写一个脚本,用于监视网页上用户配置文件中的更新。登录本网站受到CSRF对策的保护,这是一件好事。但是,我无法让我的脚本登录到此站点通过Python登录网站-如何处理CSRF?,python,robobrowser,mechanicalsoup,Python,Robobrowser,Mechanicalsoup,我正在使用Python3编写一个脚本,用于监视网页上用户配置文件中的更新。登录本网站受到CSRF对策的保护,这是一件好事。但是,我无法让我的脚本登录到此站点 我使用机械组的方法: import mechanicalsoup browser = mechanicalsoup.Browser() login_page = browser.get(base_url) login_form = login_page.soup.select(".form-signin")[0] login_form
- 我使用
的方法:机械组
import mechanicalsoup browser = mechanicalsoup.Browser() login_page = browser.get(base_url) login_form = login_page.soup.select(".form-signin")[0] login_form.find(attrs={"name": "username"})['value'] = 'username' login_form.find(attrs={"name": "password"})['value'] = 'password' page2 = browser.submit(login_form, login_url) print(str(page2.text))
- 我使用
的方法:机器人浏览器
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.submit_form(form) print(str(browser.select))
403
,并且有一条消息说CSRF验证失败。请求中止。
- 有没有办法解决这个问题
- 该表单有一个包含CSRF令牌的隐藏输入。我猜
和mechanicalsoup
也将提交此输入。我说得对吗?还是我必须特别对待它robobrowser
- 我认为这两个包使用的会话将处理cookies之类的一切。我错过了什么吗
form["username"] = 'username'
form["password"] = 'password'
form["csrffieldname"] = 'csrfvalue' # This is what you are missing
每次提交表单时,令牌值都会不同,因此您必须获取表单并解析出csrf令牌值,然后在令牌超时之前提交。我通过设置
Referer
头,使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))
csrf已经在表单中。再次手动将其添加到表单不会更改行为。仍然是403。您能否在此之前迭代并打印表单中的值:
浏览器。提交表单(表单)
?感谢您的努力,但问题是缺少参考
标题。我按照您的建议检查了表单对象,但它包含了所有内容。看起来这是这个特定web应用程序的一种特殊行为,因为我不明白为什么需要推荐人。