Logowanie przez IdHTTP

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Logowanie przez IdHTTP

Nowy postprzez duf » środa, 17 lutego 2010, 16:41

Próbuję zalogować się do forum używając IdHTTP. Ale mi to nie wychodzi. Proszę o sprawdzenie co jest niewłaściwe w kodzie. Robię to po raz pierwszy i nie wiem co jest źle.

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String s;
  TStringList* dane = new TStringList(this);
  TMemoryStream *Receive = new TMemoryStream() ;

  dane->Add( "name=duf&password=haslo" ); // z
  IdHTTP1->Post("http://programowanie.cal.pl/forum/ucp.php?mode=login", dane, Receive);

  IdHTTP1->Get("http://programowanie.cal.pl/forum/ucp.php?mode=login", Receive);
  Receive->SaveToFile("Response.txt");
  dane->LoadFromFile("Response.txt");
  Memo1->Lines->Add( dane->Text );

  CppWebBrowser1->Navigate(WideString("http://programowanie.cal.pl/forum/index.php").c_bstr());

  delete dane; delete Receive;
}
//---------------------------------------------------------------------------


Ze źródła strony logowanie wygląda tak:


<input type="text" tabindex="1" name="username" id="username" size="25" value="" class="inputbox autowidth" /></dd>
</dl>
<dl>
<dt><label for="password">Hasło:</label></dt>
<dd><input type="password" tabindex="2" id="password" name="password" size="25" class="inputbox autowidth" /></dd>

Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » środa, 17 lutego 2010, 17:21

To nie przejdzie! Chyba nie wiesz jak jest skonstruowane to forum, ja zresztą też tego nie wiem, gdyż nie ja je tworzyłem, tylko zainstalowałem, ale żeby pobrać jakieś dane z forum potrzebny jest dostęp do bazy MySQL. Baza jest zabezpieczona hasłem. Plik PHP z hasłem i loginem do bazy danych nie jest udostępniany nawet przeglądarce, a jedynie skryptom na serwerze. Nie możesz się zalogować za pomocą komponentu IdHTTP, gdyż nie ma on dostępu do bazy MySQL, a pośrednio przez plik upc.php nie da się, gdyż plik ten wymaga przetworzenia przez przeglądarkę i aktywowania pewnych skryptów, które łączą się z bazą MySQL.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez duf » środa, 17 lutego 2010, 18:17

W takim razie do jakich stron można się zalogować używając szablonu podanego kodu? Czy ten kod można jakoś sprawdzić pod względem działania?
Czy może za pomocą TCppWebbrowsera można się tu albo gdziekolwiek zalogować?
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » środa, 17 lutego 2010, 18:21

Cyfrowy Baron napisał(a):(...) ale żeby pobrać jakieś dane z forum potrzebny jest dostęp do bazy MySQL

Owszem, ma go poprzez protokół HTTP, podobnie jak przeglądarka.

Cyfrowy Baron napisał(a):Nie możesz się zalogować za pomocą komponentu IdHTTP (...) a pośrednio przez plik upc.php nie da się, gdyż plik ten wymaga przetworzenia przez przeglądarkę i aktywowania pewnych skryptów, które łączą się z bazą MySQL.

Łączenie z bazą danych odbywa się po stronie serwera, a to, co dostaje klient, to gotowa strona HTML.

Myślę, że problemem mogą być dwie sprawy: sposób przekazywania hasła do serwera - coś nie wydaje mi się, żeby w sposób jawny było wysyłane, i obsługa ciasteczek, która jest niezbędna do tego, żeby serwer mógł rozpoznać zalogowanego użytkownika.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » środa, 17 lutego 2010, 18:33

Owszem, ma go poprzez protokół HTTP, podobnie jak przeglądarka.
[...]
Łączenie z bazą danych odbywa się po stronie serwera, a to, co dostaje klient, to gotowa strona HTML.


To prawda, ale przeglądarka parsuje stronę, a czy komponent IdHTML też to robi. Zauważ, że komponent wysyła zapytanie do pliku ucp.php, jeżeli załadujesz ten plik do przeglądarki i podejrzysz kod, to znajdziesz tam zawartość kilku różnych plików na które składa się forum. Dzieje się tak dlatego, że plik ucp.php zawiera mechanizm ładujący różne pliki w skład których wchodzi forum, te pliki i skrypty z kolei ładują inne skrypty i pliki. By dostać się do bazy danych niezbędny jest dostęp do pliku config.php, ale dostępu do tego pliku przeglądarka nie ma, spróbuj załadować adres: config.php

Zawartość pliku ucp.php jest inna od tego co się wyświetli po załadowaniu tegoż pliku do przeglądarki: ucp.php

Nie wiem jak działa ten mechanizm, ale przypuszczam, że jest to tak zabezpieczone, by nie można było uzyskać dostępu za pomocą bota.

Przekazanie hasła do serwera, a więc i dostęp do bazy MySQL wymaga podania nazwy bazy danych i hasła dostępu do bazy, a te znajdują się w pliku config.php. Bezpośredni dostęp do tego pliku nie jest możliwy. Można się do niego dostać tylko poprzez uaktywnienie odpowiednich skryptów, a to się odbywa poza kontrolą użytkownika.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » środa, 17 lutego 2010, 18:54

Przekazanie hasła do serwera, a więc i dostęp do bazy MySQL wymaga podania nazwy bazy danych i hasła dostępu do bazy, a te znajdują się w pliku config.php.

Żadnej tam nazwy bazy. To, co masz w config.php, to ustawienia administratora, klientowi nic do nich. W normalnym trybie, przy logowaniu użytkownik wysyła login i hasło (prawdopodobnie metodą POST), a po stronie serwera, w skrypcie ucp.php, hasło to jest weryfikowane, jeśli login/user występuje w bazie danych jako zarejestrowany. W odpowiedzi klient dostaje stronę HTML z potwierdzeniem pomyślnego (lub nie) logowania plus ciasteczko.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » środa, 17 lutego 2010, 19:14

@duf, dopiero teraz zauważyłem:
Kod: Zaznacz cały
dane->Add( "name=duf&password=haslo" );

To 'name' skąd wziąłeś, jeśli atrybut name pola username to 'username'?

--- EDIT ---
Ok, hasło jest przekazywane jawnie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » środa, 17 lutego 2010, 20:25

OK! Rozumiem! Jak często wspominałem na skryptach PHP zupełnie się nie znam.



Kod: Zaznacz cały
  Receive->SaveToFile("Response.txt");
  dane->LoadFromFile("Response.txt");


Dlaczego u ciebie przekazywanie danych z klasy TMemoryStream odbywa się poprzez plik, przecież możesz bezpośrednio:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      String s;
      TStringList* dane = new TStringList(this);
      TMemoryStream *Receive = new TMemoryStream() ;

      dane->Add( "username=duf&password=haslo" ); // z
      IdHTTP1->Post("http://programowanie.cal.pl/forum/ucp.php?mode=login", dane, Receive);

      IdHTTP1->Get("http://programowanie.cal.pl/forum/ucp.php?mode=login", Receive);

      Receive->Position = 0;
      dane->LoadFromStream(Receive);

      Memo1->Lines->Add( dane->Text );

      CppWebBrowser1->Navigate(WideString("http://programowanie.cal.pl/forum/index.php").c_bstr());

      delete dane; delete Receive;
}
//---------------------------------------------------------------------------


TStringList nie wymaga parametru this.

Patrząc na Twój kod odnoszę wrażenie, że obiekt klasy TStringList jest zbędny, gdyż można od razu z klasy TMemoryStream przenieść dane do Memo1:

Kod: Zaznacz cały
void __fastcall TForm1::Button1Click(TObject *Sender)
{
      String s;
      TMemoryStream *Receive = new TMemoryStream() ;

      dane->Add( "username=duf&password=haslo" ); // z
      IdHTTP1->Post("http://programowanie.cal.pl/forum/ucp.php?mode=login", dane, Receive);

      IdHTTP1->Get("http://programowanie.cal.pl/forum/ucp.php?mode=login", Receive);

      Receive->Position = 0;

      Memo1->Lines->LoadFromStream(Receive);

      // gdybyś potrzebował zapisać do pliku Response.txt
     Memo1->Lines->SaveToFile(ExtractFilePath(ParamStr(0)) + "Response.txt");

     CppWebBrowser1->Navigate(WideString("http://programowanie.cal.pl/forum/index.php").c_bstr());

     delete Receive;
}
//---------------------------------------------------------------------------
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez duf » czwartek, 18 lutego 2010, 10:49

Dziękuję za uwagi, są przydatne.
Ale wracając do sprawy logowań to zauważyłem, że nie wszystkie strony odpowiadają na funkcję Get() a niektóre wręcz odmawiają odpowiedzi w postaci blędu np: "IOHandler is not valid". Ale o dziwo udało mi się zalogować na Naszej Klasie. W odpowiedzi Get() widzę swoje dane zapisane również do pliku. Pytanie brzmi jak można otworzyć taką stronę w kontrolce WebBrowser mając ją zapisaną w postaci pliku?
Intuicyjnie wyczuwam, że logowanie do stron byłoby bardziej prawdopodobne poprzez użycie kontrolki WebBrowser i składni z Delphi, którą niestety nie potrafię przerobić na C++.
Kod: Zaznacz cały
WebBrowser.OleObject.Document.login.value = login;
WebBrowser.OleObject.Document.paswsword.value = haslo;
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » czwartek, 18 lutego 2010, 11:11

Pytanie brzmi jak można otworzyć taką stronę w kontrolce WebBrowser mając ją zapisaną w postaci pliku?


Nie jestem pewien czy dobrze rozumiem pytanie. Chcesz zapisać stronę logowania do pliku, a potem otworzyć ją w kontrolce WebBrowser i się do niej zalogować?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » czwartek, 18 lutego 2010, 11:26

duf napisał(a):Intuicyjnie wyczuwam, że logowanie do stron byłoby bardziej prawdopodobne poprzez użycie kontrolki WebBrowser i składni z Delphi, którą niestety nie potrafię przerobić na C++.
Kod: Zaznacz cały
WebBrowser.OleObject.Document.login.value = login;
WebBrowser.OleObject.Document.paswsword.value = haslo;

A skąd masz ten fragment kodu?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez duf » czwartek, 18 lutego 2010, 11:28

Raczej nie w te strone.
Kod: Zaznacz cały
Receive->SaveToFile("Response.txt");

Ta instrukcja zapisuje w pliku .txt "stronę" już po zalogowaniu. Widzę tu informacje, które występują w przeglądarce po zalogowaniu. Próbowałem otworzyć ten plik za pomocą programu Firefox ale dalej widzę tylko sam tekst z pliku.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="pl" dir="ltr">
<head>
<script type="text/javascript">var nk_document_start_timestamp = new Date().getTime()</script><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta name="robots" content="noindex">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/main:43be">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/sledzik:d0d9">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/popup:e81c">
<link rel="alternate" type="application/rss+xml" title="rss" href="http://nasza-klasa.pl/feeds/rss/blog">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/avatar:19e9">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/school:0f94">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/forum:9237">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/btab:d813">
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/widgets/widgets:420c">
<link rel="icon" type="image/x-icon" href="http://static.nasza-klasa.pl/img/favicon_2010.ico">
<link rel="shortcut icon" type="image/x-icon" href="http://static.nasza-klasa.pl/img/favicon_2010.ico">
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/ie_lte7:8570">
<![endif]-->
itd..........................................
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez duf » czwartek, 18 lutego 2010, 11:34

polymorphism napisał(a):A skąd masz ten fragment kodu?


Mam jeszcze kilka innych, np:
Kod: Zaznacz cały
WebBrowser1.OleObject.Document.Body.Style.Zoom = 0.75;

Do zmiany wielkości chyba czcionki. Oczywiście wszystkie te informacje pochodzą z for, które ostatnio intensywnie przeglądam.
Avatar użytkownika
duf
Intelektryk
Intelektryk
 
Posty: 175
Dołączył(a): czwartek, 9 października 2008, 13:02
Podziękował : 17
Otrzymał podziękowań: 2
System operacyjny: Windows 10
Kompilator: XE8
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez polymorphism » czwartek, 18 lutego 2010, 12:14

Aha. Głównie chodzi mi o to, że ten kod, który podałeś, jakoś mi nie pasuje z opisem interfejsu IHTMLDocument2 (i wyżej), bo jak rozumiem, WebBrowser.OleObject.Document bazuje właśnie na tym interfejsie, a tam nie ma metod login i password. No chyba że coś przeoczyłem...

Z drugiej strony brak tych metod jest zrozumiały, bo przecież sposób logowania w głównej mierze zależy od tego, jak go sobie twórca strony wymyślił, nie ma jakiejś ściśle określonej reguły. Więc myślę, że nikt by nie tworzył specjalnych metod w klasie na coś, co z dużym prawdopodobieństwem nie będzie działać.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Logowanie przez IdHTTP

Nowy postprzez Cyfrowy Baron » czwartek, 18 lutego 2010, 12:57

Ta instrukcja zapisuje w pliku .txt "stronę" już po zalogowaniu. Widzę tu informacje, które występują w przeglądarce po zalogowaniu. Próbowałem otworzyć ten plik za pomocą programu Firefox ale dalej widzę tylko sam tekst z pliku.


Nie chciałbym palnąć jakieś głupoty bo na skryptach PHP się nie znam, ale do pliku nie są zapisywane pliki php w takiej postaci w jakiej znajdują się na serwerze, lecz pliki po parsowaniu.

Musisz zapisać ten plik z rozszerzeniem HTM, wtedy przeglądarka potraktuje go jako stronę sieci WEB a nie jako plik tekstowy.



Kod: Zaznacz cały
<link rel="stylesheet" type="text/css" href="http://static.nasza-klasa.pl/style/main:43be">


To link do pliku na serwerze nasza-klasa, nie może być załadowany razem ze stroną wczytana z dysku twardego, gdyż stanowi element jakiegoś mechanizmu PHP. Obsługa plików PHP jest możliwa tylko na serwerach, które obsługują PHP, więc wczytywanie plików PHP z dysku lokalnego odpada.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron