cURL - logowanie do strony

System: Ubuntu
Obsluga: terminal
Poziom znajomości terminala: podstawowy

Potrzebuję zalogować się do serwisu www po https, zapisać kilka stron oraz wylogować się z serwisu.

  1. Czy przesłanie hasła cURL’em w postaci jawnej jest bezpieczne w przypadku strony po https?
  2. Jak to zrobić za pomocą cURL krok po kroku?

Dzięki za rzeczowe odpowiedzi :blush:

Strona jest za CloutFlare to po pierwsze.
Po drugie generuje token, który musi być w POST, bo inaczej będzie błąd 302. Po trzecie na pewno ten przykład nie należy do podstaw jeżeli chodzi o znajomość terminala.

Czy przesłanie hasła cURL’em w postaci jawnej jest bezpieczne w przypadku strony po https?

Sam sobie odpowiedziałeś - HTTPS - nie jest jawne tylko szyfrowane. Tak samo wysyła dane logowania formularz na stronie.

Nikt Ci gotowego curl’a nia da, bo ten musisz sobie sam stworzyć w oparciu o wartość swojego ciasteczka z tej strony i user-agenta przeglądarki i innych nagłówków.
Nie mam tam danych logowania, więc mogę podać przykład, który jednak musisz dostosować.
Podam w oparciu o Firefox, bo tą przeglądarkę najlepiej znam.

  1. Wchodzisz na stronę logowania.
  2. Otwierasz monitor sieci Ctrl+Shift+E: Wpisujesz fałszywe dane logowania np. asdjasiofha@sdajsdpj.com, hasło: asdijasoidjapsfhuasd i ENTER
  3. Bierzesz pierwszą pozycję na liście. PPM>Kopiuj wartość>Kopiuj jako polecenie programou cURL
    Wklej sobie to gdzieś.

Interesuje Cię nagłówek zawierający Cookie, SEVERID i rozdzielczosc

Budujesz pierwszą część skryptu wyciągającego token, który jest po tagu </html> w kodzie strony.

#!/bin/bash

token="$(curl -s 'https://mobidziennik.pl/logowanie' -H 'User-Agent: TWÓJ_USER_AGENT' -H 'Referer: https://mobidziennik.pl/' -H 'Cookie: WARTOŚĆ_CIASTECZKA; SERVERID=TWOJA_WARTOŚĆ; rozdzielczosc=TWOJA_ROZDZILCZOŚĆ' | grep -P '</[html]+>' | cut -d '"' -f6)"
echo -e "TWÓJ TOKEN TO: $token\n\n"

Po dostosowaniu do wartości z Twojej sesji curl wyciąga wartość tokena potrzebnego w drugim kroku i podstawia go pod zmienną $token.
Token ma długość 128 znaków.
Będzie on właściwy dla bieżącej sesji/cookie.

Teraz to, co skopiowałeś w poprzednim kroku z Firefoxa modyfikujesz.
Dodaj sobie po curl parametr -i, aby widzieć odpowiedź.
Modyfikujesz:
--data-raw 'email=POCZĄTEK_EMAILA%40HOST.PL&haslo=HASŁO_LOGOWANIA&t=TWÓJ_TOKEN'

Podmieniając na prawdziwy login i hasło, a także token wygenerowany w poprzednim kroku.
Kod odpowiedzi serwera jest 200, więc prawdopodobnie działa.
Po tym jak odświeżysz w przeglądarce stronę to powinna być zalogowana.

@Domker napisałem skrypt wg Twoich wskazówek, niestety nie mogę zalogować się do strony.
Próbowałem ulepszyć skrypt korzystając z zapytania generowanego przez przeglądarkę i zmodyfikowanego poprzez podanie adresu mailowego oraz hasla.

#!/bin/bash
token="$(curl -s 'https://mobidziennik.pl/logowanie' -H 'User-Agent: TWÓJ_USER_AGENT' -H 'Referer: https://mobidziennik.pl/' -H 'Cookie: WARTOŚĆ_CIASTECZKA; SERVERID=TWOJA_WARTOŚĆ; rozdzielczosc=TWOJA_ROZDZILCZOŚĆ' | grep -P '</[html]+>' | cut -d '"' -f6)"
echo -e "TOKEN: $token\n"
echo -e "Podaj email:"
read mail
echo -e "Podaj haslo: "
read -s passwd
curl -s --data-raw "email=$mail&haslo=$passwd&t=$token" 'https://mobidziennik.pl/logowanie' -X POST -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: pl,en-US;q=0.7,en;q=0.3' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: https://mobidziennik.pl' -H 'DNT: 1' -H 'Connection: keep-alive' -H 'Referer: https://mobidziennik.pl/logowanie' -H 'Cookie: aa; SERVERID=D9; rozdzielczosc=1760x990' -H 'Upgrade-Insecure-Requests: 1' -H 'Sec-Fetch-Dest: document' -H 'Sec-Fetch-Mode: navigate' -H 'Sec-Fetch-Site: same-origin' -H 'Sec-Fetch-User: ?1'
# docelowy adres: 
#curl -sL "https://mobidziennik.pl/dziennik/tematy" 

Czy kod kod 200 nie jest zwracany gdy uzyska się odpowiedź z serwera? Nawiązanie połączenia nie jest jednoznaczne z zalogowaniem.

Temat pozostaje otwarty. Będę wdzięczny za rzeczowe odpowiedzi.

Takie rzeczy łatwiej zrobić w Python. Jeżeli znasz go choć trochę lub zamierzasz się go nauczyć, to poniżej podpowiedzi:
Skupiłbym się na pywebcopy

inne pomocne linki

Tak jak napisał @Domker temat wcale nie jest prosty, choć może się taki wydawać.

1 polubienie

@Bradlee: odnośnie Pythona w przypadku gdy używam request’a do połączenia: czy trzeba ‘wylogować się’ po wykonaniu zapytania? Jeżeli tak, to użycie linku że strony ‘Wyloguj’ będzie poprawne?

@Bradlee dzięki za sugestie - zalogowalem się używając Pythona, ba nawet potrafię uruchomić skrypt basha z Pythona :slight_smile:

Myślę, że wylogowanie przez wspomniany link będzie poprawne. Tak czy inaczej pewnie serwis automatycznie wyloguje sesję po określonym czasie nieaktywności

Bardzo fajnie, że się udało zrobić :slight_smile: