Войти с помощью Python запросов и csrf-токена - PullRequest
0 голосов
/ 28 октября 2018

Я использую модуль запросов для Python, чтобы попытаться войти на веб-странице.Я открываю request.session (), затем получаю cookie и токен csrf, который включен в метатег.Я создаю свою полезную нагрузку с помощью имени пользователя, пароля, скрытого поля ввода и токена csrf из метатега.После этого я использую метод post и прохожу через URL логина, куки, полезную нагрузку и заголовок.Но после этого я не могу получить доступ к странице за страницей входа.Что я делаю не так?

Это заголовок запроса при вводе логина:

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 Ответ

0 голосов
/ 30 октября 2018

Стоит отметить, что ваш запрос при использовании модуля Python Requests не будет точно таким же, как стандартный запрос пользователя.Чтобы полностью имитировать реалистичный запрос и, таким образом, не блокироваться каким-либо межсетевым экраном или мерами безопасности сайта, вам необходимо скопировать все параметры POST, параметры GET и, наконец, заголовки.

Вы можете использоватьинструмент, такой как Burp Suite для перехвата запроса на вход.Скопируйте URL-адрес, на который он отправляет, скопируйте также все параметры POST и, наконец, скопируйте все заголовки.Вы должны использовать функцию requests.Session() для хранения файлов cookie.Возможно, вы также захотите сделать начальный сеанс GET-запроса на домашнюю страницу, чтобы забрать куки-файлы, поскольку для пользователя нереально отправить запрос на вход без предварительного посещения домашней страницы.

Надеюсь, это имеет смыслпараметры заголовка можно передать так:

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)
...