Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2019 01:56:55

sweetlan@
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

Здравствуйте. Погомогите пожалуйста хоть каким-нить советом
Решила попробовать свое первое реальное практическое задание в жизни. По работе имею дело с кучей выписок и захотелось автоматизировать процесс скачивания огромного кол-ва. Есть внутренний портал с личнм кабинетом. С авторизацией сумела самостоятельно разобраться и думала, что это самое сложное. Но оказалось, что взять другую страницу для дальнейшей обработки (простейшая задача) не выходит, она не отдается корректно. Мне кажется, там какие-то защитные механизмы не позволяют и я их не до конца понимаю. Я поняла, что используется защита от csrf и что нужно всегда использовать в запросах токен и скорее всего и куки INT_OPT_LOW в которой также что-то зашифировано, пример вывода куки $coo: PasdflwerKASdhwerj-epYDFsdf-!23948234123-33212387, вывод $token: vYfhHrysjs1s8s2j2GshsdfjwrTghuduT=

При авторации отправляя запрос на https://login.site.com/off/pub/j_check происходит следующее:
1. по 302 редиректу перенаправляет на https://login.site.com/off/
2. опять 302 но уже на https://login.site.com/off
3. еще раз 302 на https://login.site.com/off/gen/initSession?csrfToken=vYfhHrysjs1s8s2j2GshsdfjwrTghuduT=
4. и последний раз 302 на домашнюю https://login.site.com/off/gen/Home.htm?csrfToken=vYfhHrysjs1s8s2j2GshsdfjwrTghuduT= после чего пытаюсь перейти по любой ссылке, например https://login.site.com/off/st/Stat.htm?csrfToken=vYfhHrysjs1s8s2j2GshsdfjwrTghuduT=
в браузере при таком переходе никакие редиректы не происходят запросы точно такие же как у меня (я их скопировала и передаю идентичные), ответы по браузеру как на скриншоте, а через питон получаю ответ с 404 ошибкой.

Пробовала в браузере грузить ссылку без токена и также получаю 404. Поэтому, складывается впечатление, что через питон запрос уходит без токена, но ведь в коде в запросе токен присваивается, да и сессия также используется. Может еще какие-то параметры упускаю, куда рыть!?

 import requests
from bs4 import BeautifulSoup
import requests.cookies
from urllib.parse import urljoin
html_doc = requests.get('https://login.site.com/off/pub/preEnt.htm').text
soup = BeautifulSoup(html_doc)
tokenstart = soup.find('div', 'col-lg-6 col-12 align-to-cta')
for a in tokenstart.find_all('a'):
    token1 = a.get('href')
tok = token1.split('Token=')
token = tok[1]
def logbot():
    s = requests.Session()
    s.get('https://login.site.com/off/pub/preEnt.htm')
    d = {'j_usr': 'USEER',
         'j_pwd': 'PASSW00RD',
         'csrfToken': token
         }
    r = s.post('https://login.site.com/off/pub/j_check', data=d, allow_redirects=True)
    p = str(s.cookies.get_dict())
    o = list(p.split(': '))
    p1 = o[1]
    cook = "".join(c for c in p1 if c not in '\'}')
    coo = {'INT_OPT_LOW': cook}
    head = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
        'Connection': 'keep-alive',
        'Host': 'login.site.com',
        'Referer': 'https://login.site.com/off/gen/Home.htm?csrfToken=' + token,
        'Upgrade-Insecure-Request': '1',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:65.0) Gecko/20100101 Firefox/65.0'
    }
    r2 = s.get('https://login.site.com/off/st/Stat.htm?csrfToken=' + token, headers=head, cookies=coo)
    return r2.text
print(logbot())

Отредактировано sweetlan@ (Фев. 25, 2019 05:57:49)

Прикреплённый файлы:
attachment Screen Shot 2019-02-22 at 3.51.10 PM.png (24,1 KБ)

Офлайн

#2 Фев. 23, 2019 02:51:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

sweetlan@
  
s.get('https://login.site.com/off/st/Stat.htm' + token
Что ты прибавляешь к адресу страницы?



Офлайн

#3 Фев. 23, 2019 04:50:11

sweetlan@
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

py.user.next
1. Прибавляю токен который греплю из страницы еще до авторизации, он есть в одном из HTML тегов в значении ссылки, вот оттуда его выдераю и через переменную token куда нужно вставляю, ведь в окне браузера все ссылки с этим токеном, без токена страницы не загрузятся.
2. Прибавляю заголовки
3. Прибавляю 1 куки имя его INT_OPT_LOW

Отредактировано sweetlan@ (Фев. 23, 2019 04:50:55)

Офлайн

#4 Фев. 23, 2019 05:37:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

Ну неправильно прибавляешь. Stat.htm - это ресурс, ему должны передаваться аргументы через знак вопроса. Прибавляя же так, как я выделил из твоего кода, ты обращаешься к ресурсу Stat.htmblablabla, которого нет на сервере. Поэтому он возвращает 404 - ресурс не найден.



Офлайн

#5 Фев. 25, 2019 05:57:19

sweetlan@
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

py.user.next
Ну неправильно прибавляешь. Stat.htm - это ресурс, ему должны передаваться аргументы через знак вопроса. Прибавляя же так, как я выделил из твоего кода, ты обращаешься к ресурсу Stat.htmblablabla, которого нет на сервере. Поэтому он возвращает 404 - ресурс не найден.
Ой, моя ошибка когда писала сообщение и оно куда-то делось, в коде именно так Stat.htm?csrfToken=' + token, точно также как и у реферера. Т.е. строчка должна быть такой
  r2 = s.get('https://login.site.com/off/st/Stat.htm?csrfToken=' + token, headers=head, cookies=coo)
но к сожалению никакой разницы и 404 как обычно получаю.
Поправила свое первое сообщение, чтобы без ошибки было.
Кстати отравляя запрос, что с токеном, что без него, результат все равно 404.

Офлайн

#6 Фев. 25, 2019 09:37:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

Значит, надо узнать, что отсылается через питон.

Можешь чисто наугад ковырять печенье. Оно неправильно переделывается, так как превращать словарь в строку в питоне не принято. Скорее всего, ошибка где-то там, но может и в другом месте быть. Например, что-то не передаётся, а должно передаваться; а не передаётся потому, что теряется где-то при переделывании.

Чтобы это решить эффективнее, нужно:
1) Узнать, что именно посылается браузером.
2) Узнать, что именно посылается питоном.
3) Выровнять то, что посылается питоном, до такой степени, чтобы это было неотличимо от браузера.

Обычно (хоть ты и говоришь, что там супер-защита) никакой супер-защиты нет. Нужно выделить только самые ключевые элементы и их использовать.

sweetlan@
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
Вот эти все заголовки вообще можно не передавать. Они никогда не проверяются, меняются от браузера к браузеру и вообще нафиг не нужны. А вот в печенье может быть что-то важное и оно не соблюдено. Часто там вся защита строится на referer + agent + печенье.

Для анализа того, что посылает браузер, надо открыть консоль браузера и записать оттуда все запросы-ответы.
Для анализа того, что посылает питон, можно использовать netcat. Только там везде https надо заменить на http, чтобы шифрование было убрано. Через netcat можно посылать ответы на запросы, которые питон будет принимать, обрабатывать и дальше что-то запрашивать на основе принятых данных.
Дальше ты просто сравниваешь эти две сессии (браузерную и потонью) между собой и ищешь то, чего не хватает в питоньей.

Можно и прослушать обмен между браузером и этим настоящим сервисом, но тогда в сниффер (Wireshark или tcpdump) нужно вставить SSL-ключ, чтобы расшифровывать https-трафик на лету, - довольно-таки не тривиальная задачка, потому что когда ключ туда вставляешь, он как не расшифровывал ничего, так и не расшифровывает. И там нигде не написано, в чём ошибка.



Отредактировано py.user.next (Фев. 25, 2019 09:45:38)

Офлайн

#7 Фев. 25, 2019 19:58:40

sweetlan@
Зарегистрирован: 2019-02-23
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите с работой внутри кабинета

Спасибо за наводки, буду пробовать и перепроверить все.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version