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

Sco*_*tus 6 python robobrowser mechanicalsoup

我正在使用Python 3作为脚本,该脚本将监视用户在网页上的个人资料中的更新.登录此站点受CSRF对策的保护,这是一件好事.但是,我无法让我的脚本登录此站点.

  • 我的方法使用mechanicalsoup:

    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))
    
    Run Code Online (Sandbox Code Playgroud)
  • 我的方法使用robobrowser:

    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))
    
    Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我最终得到HTTP状态403和消息说CSRF verification failed. Request aborted.

  • 任何想法如何解决这一问题?
  • 有问题的表单有一个包含CSRF令牌的隐藏输入.我想mechanicalsoup并且robobrowser也会提交此输入.我对吗?或者我必须特别对待它?
  • 我认为这两个包使用的会话将处理像cookie等所有内容.有没有我错过的东西?

Sco*_*tus 9

robobrowser通过设置Referer标题让变种工作.

browser.session.headers['Referer'] = base_url
Run Code Online (Sandbox Code Playgroud)

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

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))
Run Code Online (Sandbox Code Playgroud)