Python 3.3.5 requests - logowanie na stronie

0

Witam
Za pomocą modułu requests chce napisać krótki program, za pomocą którego będę logował się na jakiejś stronie www i pobrać zawartość strony (która jest chroniona - musze sie zalogowac zeby do niej przejsc)
Udało mi się zrobić tyle (i wiele wiecej, ale pokasowałem bo nie działało) i nie moge dojść do celu

import requests

url = r'http://4programmers.net/Logowanie'
data = {
    'name': 'mojLoginDo4Programmers',
    'password': 'mojeHasloDo4Programmers',
}
session = requests.session()
session.post(url, data)

resp = session.get(r'http://4programmers.net/User')
print(resp.text)
print(resp.headers)

Jeśli chodzi o "name" i "password" w dictionary to tak sie nazywają pola logowania na stronie (parametry name)
http://4programmers.net/Logowanie - strona logowania
http://4programmers.net/User - strona chroniona logowaniem
I resp.headers zwraca mi ciagle zrodlo strony logowania. Uzywam pyhona 3.3.5. Próbowałem użyć modułu mechanize, ale on jest tylko pod wersje mniejsze od 3.
Ktoś jest w stanie powiedzieć co robie źle ?:P

0

hash539b3e967279f

Takie coś musisz jeszcze dodać jako klucz do słownika i zawartość różna dla różnych haseł(raczej). W przypadku 4programmers oczywiscie.

Tu masz przykładowy działający kod logowania.

        url = "url"
        url_2 = "url_inny"
        header = {
            "Referel" : url_2
        }
        csrf = {
            "user":	"x",
            "password":	"haslo"
        }
        session = requests.Session()
        session.get(url)
        response = session.post(url, data=csrf, headers=header)
0

@anonimowy a dlaczego musze dodać coś takiego, co to jest :P? i jaki zrobić key dla tego hash539b3e967279f (bo rozumiem ze to jest value)?

edit
jak sprawdziłem to te kod, który podałeś pokazuje mi zrodlo strony ale jeszcze przed zalogowaniem. Po prostu inputy na stronie maja value=to co dałem w login i password w csrf
jak zrobie session.get(url_2) to wyswietla sie tak sama strona ale bez wypełnionych tych pól, session.get(url_2, params=csrf) daje to samo

0
azalut napisał(a):

@anonimowy a dlaczego musze dodać coś takiego, co to jest :P? i jaki zrobić key dla tego hash539b3e967279f (bo rozumiem ze to jest value)?

edit
jak sprawdziłem to te kod, który podałeś pokazuje mi zrodlo strony ale jeszcze przed zalogowaniem. Po prostu inputy na stronie maja value=to co dałem w login i password w csrf
jak zrobie session.get(url_2) to wyswietla sie tak sama strona ale bez wypełnionych tych pól, session.get(url_2, params=csrf) daje to samo

url_2 używam tylko do tego, żeby dać to jako Referel czyli z jakiej strony wchodzisz na tą strone, wiele stron ma takie zabezpieczenie, że żeby się zalogować musisz mieć ostatnio odwiedzoną strone ich strone logowania.
Nie wiem jaki hash stosuje 4programmers, albo sam wyciągasz to ze strony, albo jest to zakodowane hasło.

#edit

Po prostu pobierasz nazwe i wartość, ta nazwa hashXXX to była przykładowa jaką podałem, dla każdego jest inna.

Wchodzisz na strone logowania za pomocą get, pobierasz jej tekst, wyciągasz te pola, i wysyłasz formularz post z tymi już danymi.

0

Zakodowane hasło :D :D :D
csrf = cross site request forgery
Taki magiczny token stosuje się po to, żeby ktoś nie podesłał ci spreparowanego linka który automatycznie doda ci na przykład posta na facebooku. W wielu serwisach można przez parametry GET zrobić bardzo dużo i mogłoby to być bolesne. W efekcie robi się taki myk, że na stronie jest wygenerowany specjalny losowy token który jest sprawdzany. Jeśli się zgadza to znaczy że faktycznie ktoś "przyszedł" z naszej strony. Jeśli nie jest to znaczy że nie.

0

@anonimowy @Shalom
To znaczy, że mam zrobić mniej wiecej tak: wejśc na stronę na dowolny link za pomocą get(zeby 'przyjsc z ich strony') i to będzie mój link Referer. Potem zrobić post'a na ten link który chce i w tym słowniku zawrzeć login hasło i ten hash z wartością oraz nagłówek z tym Referer: link
Obrazekjp_eesxqas.jpg

Tylko pojawia się pytanie: jak wejde choćby na ht tp://4programmers.net/Forum/Inne/235153-python_335_requests_-_logowanie_na_stronie za pomoca tego get'a, to jak pobrać wartość tego hashXXX zebym mógł go wpisać w ten hidden input w formularzu? (ten hash jest ciagle inny)
asdjpg_eesnpre.jpg

(teraz pomyślałem) ten referer przesylac jako header czy jako normalny key:wartosc w csrf?

edit
chociaz właściwie skoro te pola są uzupełnione same z siebie, to czy ja musze je wypełniać?

0
azalut napisał(a):

@anonimowy @Shalom
To znaczy, że mam zrobić mniej wiecej tak: wejśc na stronę na dowolny link za pomocą get(zeby 'przyjsc z ich strony') i to będzie mój link Referer. Potem zrobić post'a na ten link który chce i w tym słowniku zawrzeć login hasło i ten hash z wartością oraz nagłówek z tym Referer: link
Obrazekjp_eesxqas.jpg

Tylko pojawia się pytanie: jak wejde choćby na ht tp://4programmers.net/Forum/Inne/235153-python_335_requests_-_logowanie_na_stronie za pomoca tego get'a, to jak pobrać wartość tego hashXXX zebym mógł go wpisać w ten hidden input w formularzu? (ten hash jest ciagle inny)
asdjpg_eesnpre.jpg

(teraz pomyślałem) ten referer przesylac jako header czy jako normalny key:wartosc w csrf?

edit
chociaz właściwie skoro te pola są uzupełnione same z siebie, to czy ja musze je wypełniać?

Wchodzisz getem na strone logowania, pobierasz hashe, ten link dajesz jako reflal(logowania) i wyslasz postem.

0

ok dzięki wam za pomoc, już zrozumiałem co nieco i wszystko fajnie smiga ;)

0
Shalom napisał(a):

Zakodowane hasło :D :D :D
csrf = cross site request forgery
Taki magiczny token stosuje się po to, żeby ktoś nie podesłał ci spreparowanego linka który automatycznie doda ci na przykład posta na facebooku. W wielu serwisach można przez parametry GET zrobić bardzo dużo i mogłoby to być bolesne. W efekcie robi się taki myk, że na stronie jest wygenerowany specjalny losowy token który jest sprawdzany. Jeśli się zgadza to znaczy że faktycznie ktoś "przyszedł" z naszej strony. Jeśli nie jest to znaczy że nie.

dlatego napisałem "albo" bo nie które strony hashują hasło po stronie klienta i wysyłają je już shashowane i pomyliłem po prostu się.

0

@anonimowy żartujesz sobie? Pokaż mi jedną stronę która by tak robiła :D :D Bo gdyby faktycznie jakaś strona tak robiła to by znaczyło że:

  1. Nie używa salta...
  2. Musi wysłać użytkownikowi salta dla danego loginu.
  3. Użytkownik wysyła formularzem hasha swojego hasła, co można przechwycić.
    Wszystkie 3 opcje stanowia poważne uchybienie w kwestii bezpieczeństwa.
0
Shalom napisał(a):

@anonimowy żartujesz sobie? Pokaż mi jedną stronę która by tak robiła :D :D Bo gdyby faktycznie jakaś strona tak robiła to by znaczyło że:

  1. Nie używa salta...
  2. Musi wysłać użytkownikowi salta dla danego loginu.
  3. Użytkownik wysyła formularzem hasha swojego hasła, co można przechwycić.
    Wszystkie 3 opcje stanowia poważne uchybienie w kwestii bezpieczeństwa.

Czyli lepiej jest hasło przesyłać plain textem niż zahasowane bo zhasowane można przechwycić tak? Przczytałeś co w ogóle napisałeś? Ja nie mówie, że po stronie serwera już tego drugi raz nie hasują ani szyfruja bo to robią.

0

Źle cię zrozumiałem w takim razie. Bo to czym piszesz to jest zupełnie inna bajka -> kiedy chcesz zrobic dodatkowe zabezpieczenie przed MITM i już z formularza użytkownika leci hash / zakodowane hasło które później po stronie serwera jest hashowane z saltem i składowane. Ale to jest jednak trochę coś innego niż wysłanie gołego hasha do zapisania w bazie. Ale generalnie zamiast tak kombinować lepiej użyć SSL.

1 użytkowników online, w tym zalogowanych: 0, gości: 1