当前位置: 首页 > 知识库问答 >
问题:

使用python请求和csrf令牌登录

翟丰茂
2023-03-14

我正在使用python的请求模块尝试登录网页。我打开了一个窗口。session(),然后我得到cookie和csrf令牌,它包含在meta标记中。我使用用户名、密码、一个隐藏的输入字段和meta标记中的csrf令牌来构建有效负载。之后,我使用post方法,传递登录url、cookie、负载和头。但在那之后,我无法访问登录页面后面的页面。我做错了什么?

这是我执行登录时的请求标头:

Request Headers:

:authority: www.die-staemme.de
:method: POST
:path: /page/auth
:scheme: https
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7
content-length: 50
content-type: application/x-www-form-urlencoded
cookie: cid=261197879; remember_optout=0; ref=start; 
PHPSESSID=3eb4f503f38bfda1c6f48b8f9036574a
origin: https://www.die-staemme.de
referer: https://www.die-staemme.de/
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
x-csrf-token: 3c49b84153f91578285e0dc4f22491126c3dfecdabfbf144
x-requested-with: XMLHttpRequest

到目前为止,这是我的代码:

import requests
from bs4 import BeautifulSoup as bs
import lxml

# Page header
head= { 'Content-Type':'application/x-www-form-urlencoded',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
# Start Page
url = 'https://www.die-staemme.de/'
# Login URL
login_url = 'https://www.die-staemme.de/page/auth'
# URL behind the login page
url2= 'https://de159.die-staemme.de/game.php?screen=overview&intro'

# Open up a session
s = requests.session()

# Open the login page
r = s.get(url)

# Get the csrf-token from meta tag
soup = bs(r.text,'lxml')
csrf_token = soup.select_one('meta[name="csrf-token"]')['content']

# Get the page cookie
cookie = r.cookies

# Set CSRF-Token
head['X-CSRF-Token'] = csrf_token
head['X-Requested-With'] = 'XMLHttpRequest'

# Build the login payload
payload = {
'username': '', #<-- your username
'password': '', #<-- your password
'remember':'1' 
}

# Try to login to the page
r = s.post(login_url, cookies=cookie, data=payload, headers=head)

# Try to get a page behind the login page
r = s.get(url2)

# Check if login was successful, if so there have to be an element with the id menu_row2
soup = bs(r.text, 'lxml')
element = soup.select('#menu_row2')
print(element)

共有1个答案

单嘉泽
2023-03-14

值得注意的是,当使用Python请求模块时,您的请求不会与标准用户请求完全相同。为了完全模拟真实的请求,从而不被任何防火墙或网站的安全措施阻止,您需要复制所有POST参数、GET参数和最后的标头。

您可以使用Burp Suite等工具拦截登录请求。复制发送到的URL,同时复制所有POST参数,最后复制所有标题。您应该使用请求。Session()函数以存储cookie。您可能还希望对主页执行初始会话GET请求,以获取cookie,因为用户不首先访问主页就发送登录请求是不现实的。

我希望这是有意义的,头参数可以这样传递:

import requests

headers = {
    'User-Agent': 'My User Agent (copy your real one for a realistic request).'
}

data = {
    'username': 'John',
    'password': 'Doe'
}

s = requests.Session()
s.get("https://mywebsite.com/")
s.post("https://mywebsite.com/", data=data, headers=headers)
 类似资料:
  • 我遇到了CodeIgniter/CSRF/JSON的问题。 我正在向PHP后端发送内容类型为“application/json”的http POST请求。有效负载是json数据。我将与数据一起传递生成并存储在CSRF cookie中的CSRF令牌。对于标准POST表单请求,它工作正常,但作为json发送时失败。 由于$\u POST数组因JSON内容类型而为空,CodeIgniter无法验证coo

  • 问题内容: 几分钟前,我轻松登录了django管理控制台。我必须更改某些以超级用户身份登录时导致此错误的地方: 禁止(403)CSRF验证失败。请求中止。 当我整夜登录时,此错误使我措手不及。为什么我突然需要一个CSRF令牌进行管理员登录?你会认为登录表单已经具有该功能。这是我的admin.py: 问题答案: 管理员登录通常确实需要一个csrf令牌,但是通常所有这些都需要你注意。 检查浏览器的co

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 我在Spring5(Boot2)RESTful web服务中配置了CSRF保护,因为我希望防止CSRF攻击(我使用cookie进行身份验证和授权)。在每个请求中,我都会得到一个新的cookie。我通过标头发回的cookie的值。 我注意到、和方法需要此标记的值(在标头中)才能正常工作,但是方法没有标头也可以正常工作。 这种行为是故意的,因为方法不应该改变状态,还是我做错了什么?

  • 问题内容: 我正在尝试使用angular.js创建一个POST请求到这个Django视图。 因此,我创建了此资源。 在控制器中调用 get 方法可以正常工作。网址已翻译为。 我在执行更新/ POST方法时遇到问题。 该网址已转换为,其中缺少一个斜杠。如果在URL定义中不使用斜杠,可以很容易地避免这种情况。 代替 使用不带斜杠的变通方法,我现在得到403(禁止)状态代码,这可能是由于我未在POST请

  • 我正在使用curl来测试我的Django表单之一。我尝试过的调用(每个都有错误,为了可读性,多行调用): (1): (在cookie中使用http头和)会导致400错误,并且不会返回任何数据。 (2): (如(1)中所示,但标头属性声明中没有空格,cookie中也有)会导致相同的400错误,并且没有返回任何数据。 (3): (只有带有,没有cookie的http头)导致错误代码403,消息为:未设