首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python请求和csrf-token登录

使用python请求和csrf-token登录
EN

Stack Overflow用户
提问于 2018-10-28 22:15:41
回答 1查看 10.9K关注 0票数 2

我正在使用python的requests模块来尝试登录网页。我打开一个requests.session(),然后获得cookie和包含在元标记中的csrf-token。我使用用户名、密码、一个隐藏的输入字段和来自元标记的csrf-token构建我的有效负载。在此之后,我使用post方法,并传递登录url、cookie、有效负载和头部。但是在那之后我就不能访问登录页面后面的页面了。我做错了什么?

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 21:14:50

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

您可以使用诸如Burp Suite之类的工具来拦截登录请求。复制要将其发送到的URL,同时复制所有POST参数,最后复制所有标头。您应该使用requests.Session()函数来存储cookies。您可能还希望对主页执行初始会话GET请求,以便获取cookies,因为用户在不访问主页的情况下发送登录请求是不现实的。

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

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53032456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档