通过Python登录网站-如何处理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

我正在使用Python3编写一个脚本,用于监视网页上用户配置文件中的更新。登录本网站受到CSRF对策的保护,这是一件好事。但是,我无法让我的脚本登录到此站点

  • 我使用
    机械组
    的方法:

    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))
    
在这两种情况下,我的HTTP状态都是
403
,并且有一条消息说
CSRF验证失败。请求中止。

  • 有没有办法解决这个问题
  • 该表单有一个包含CSRF令牌的隐藏输入。我猜
    mechanicalsoup
    robobrowser
    也将提交此输入。我说得对吗?还是我必须特别对待它
  • 我认为这两个包使用的会话将处理cookies之类的一切。我错过了什么吗

您只需在提交的表单中添加用户名和密码,还需要添加csrf令牌字段。如下所示,我假设您可以计算出字段名和令牌值

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应用程序的一种特殊行为,因为我不明白为什么需要推荐人。