python - 通过 Python 登录网站 - 如何应对 CSRF?

标签 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))
    
  • 我使用 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))
    

在这两种情况下,我都得到了 403 的 HTTP 状态和一条消息说 CSRF 验证失败。请求中止。

  • 有什么解决办法吗?
  • 有问题的表单有一个包含 CSRF token 的隐藏输入。我想 mechanicalsouprobobrowser 也会提交这个输入。我对吗?还是我必须特殊对待它?
  • 我认为这两个包使用的 session 可以处理 cookie 等所有内容。我错过了什么吗?

最佳答案

我通过设置 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))

关于python - 通过 Python 登录网站 - 如何应对 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31608781/

相关文章:

python - 如何使用 Python Opencv 检测特定区域内的移动?

python - python pandas 如果在过去 N 天内满足条件则创建一个新列

python - 使用请求检索表单结果

python - RoboBrowser 搜索表单

python - RoboBrowser 表单提交

python - MechanicalSoup 棘手的 html 表格

python - MYSQL 和 python 错误

python - 带有 mechanicalsoup 的表单请求未显示预期结果

python - Request.Response 对象不会重定向到正确的 URL

嵌套循环内的python变量重新分配不起作用