Entwickler-Ecke

Internet / Netzwerk - IdHTTP + Cookie


DeadlyAppearance - Do 27.04.06 14:07
Titel: IdHTTP + Cookie
Hi.
Und zwar folgendes. Ich versuche mit einem Delphiprogramm auf eine Website zu kommen um mir via get die Quellcode zum Parsen zu holen.
Der Login auf der Seite funktioniert nur, wenn Cookies im Browser erlaubt sind. Im Cookie sind Benutzername sowie Passwort gespeichert.
Logge ich mich über den Browser ein, legt er ein Cookie an und ich kann selbst nach dem xten mal schließen des Browsers ohne Login in den geschützten Bereich.

Nun habe ich versucht mit

Delphi-Quelltext
1:
Memo1.Text:=idHTTP1.Get('http://xxx/intern.php');                    

Mir die Daten zu holen.
AllowCookies ist auf true. Dachte so benutzt er automatisch alle Cookies vom IE.
Leide komme ich immer nur auf die Seite, wo ich mich einloggen soll.

Nun ist meine Frage, wie kann ich den Cookie, welcher sich auf meiner Platte befindet benutzen um in den internen Bereich zu gelangen? Aus dem CookieManager bin ich nicht ganz schlau geworden :/.


Schon mal Danke für eure Hilfe.

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt


matze - Do 27.04.06 17:47

du musst einfach den CookieManager auf dein Formular legen, und ihn dann in der entsprechenden Eigenschaft der HTTP Kompo eintragen. That's it !


DeadlyAppearance - Fr 28.04.06 20:33

Hmm, hab den Cookiemanager aufs Forumlar gelegt und verbunden. Doch hat sich nix geändert, komme weiterhin nur auf die Loginseite.
Öffne ich die URL im IE so gelange ich sofrt in internen Bereich, sprich das Cookie existiert korrekt.


Balmung der blaue Gott - Fr 28.04.06 21:30

user profile iconDeadlyAppearance hat folgendes geschrieben:
Nun ist meine Frage, wie kann ich den Cookie, welcher sich auf meiner Platte befindet benutzen um in den internen Bereich zu gelangen? Aus dem CookieManager bin ich nicht ganz schlau geworden :/.


Falls du es nicht mit dem Manager schaffst, aber die Kompo nicht zu stark gekapselt ist, kannst du auch 'Cookie: name=Wert' mitsenden. (Wenn es keine Methode gibt und nicht auf ein Socketobjekt zugegriffen werden kann, gibt es immer noch die Möglichkeit direkt mit TClientSocket zu arbeiten.)


DeadlyAppearance - Fr 28.04.06 22:31

Verstehe dich leider nicht richtig Balmung der blaue Gott.
In google findet man leider sehr wenig bezüglich Cookies und dieser Komponente.

/edit
Habe nun eine 2. Seite versucht wo man sich auch einloggen kann.
Das steht im Cookie drin:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
cookie_data
a%3A2%3A%7Bs%3A6%3A%22user_n%22%3Bs%3A16%3A%22Benutzername%22%3Bs%3A6%3A%22user_p%22%3Bs%3A32%3A%Passwort%22%3B%7D
blasc.planet-multiplayer.de/
1536
2180579456
29854164
78498256
29780739
*


In Delphi versuche ich nun folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
var
  fn: TFileName;
  fs : TFileStream;
begin
  fn := 'C:\download.htm';
  fs := TFileStream.Create(fn, fmCreate);
  try
    try
      IdHTTP1.HandleRedirects := True;
      IdHTTP1.RedirectMaximum := 15;
      IdHTTP1.CookieManager.AddCookie('a%3A2%3A%7Bs%3A6%3A%22user_n%22%3Bs%3A16%3A%22Benutzername%22%3Bs%3A6%3A%22user_p%22%3Bs%3A32%3A%Passwort%22%3B%7Dblasc.planet-multiplayer.de/15362180579456298541647849825629780739*','blasc.planet-multiplayer.de/');
      IdHTTP1.Get('http://blasc.planet-multiplayer.de/', fs);
    except
    end;
  finally
    FreeAndNil(fs);
  end;
end;


Jedoch leider ohne Erfolg. Was mache ich falsch?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


raziel - Sa 29.04.06 09:08

Laut Indy 9 Doku sollte es das tun:


Delphi-Quelltext
1:
IdHTTP1.CookieManager.AddCookie('cookie_data=a%3A2%3A%7Bs%3A6%3A%22user_n%22%3Bs%3A16%3A%22Benutzername%22%3Bs%3A6%3A%22user_p%22%3Bs%3A32%3A%Passwort%22%3B%7Dblasc.planet-multiplayer.de/15362180579456298541647849825629780739*','blasc.planet-multiplayer.de/');                    


(Übrigens 1. Treffer bei Suche bei Google INDY ADDCOOKIE ;))

Gruß,
raziel


matze - Sa 29.04.06 09:24

es ist ja logisch, dass du mit indy auf die Login Seite kommst, da du dich ja mit den Indys noch nicht angemeldet hast.
Der Cookie Manager ließt nicht die Cookies vom IE oder anderen Browsern aus !


DeadlyAppearance - Sa 29.04.06 14:45

@raziel
leider funktioniert das nicht. Hab nun verschiedene Strings als Cookie versucht, er klappt nicht.
Leider isses auch etwas schwer herauszubekommen warum es net geht da man ja net weis was and der anderen Seite beim Webserver fehlt etc.

@matze
Das er net automatisch die IE-Cookies nutzt wusste ich nicht. Nur weis ich nun mein Beispielcookie dem Manager übergebe is halt noch die Frage die gelöst werden muss...


JayEff - Sa 29.04.06 14:57

Naja, Opera und Firefox benutzen auch nicht die IE Cookies, genausowenig wie der IE deren Cookies findet... Ich teste mal was...

edit ok. Das klappte nicht:

Delphi-Quelltext
1:
2:
http.CookieManager.AddCookie('cookie_data=a%3A2%3A%7Bs%3A6%3A%22user_n%22%3Bs%3A16%3A%22Benutzername%22%3Bs%3A6%3A%22user_p%22%3Bs%3A32%3A%Passwort%22%3B%7Dhttp://www.delphi-forum.de/15362180579456298541647849825629780739*','http://www.delphi-forum.de/');
Memo1.Text:=http.Get(edit1.Text);

Zurückgeliefert wurde mir die Seite: "Du kannst nur deine eigenen Beiträge bearbeiten"
Das müsste bedeuten, dass das Cookie garnicht beachtet wurde... Naja, ich hab wahrscheinlich irgentwas falsch gemacht ^^


DeadlyAppearance - Sa 29.04.06 15:14

1:1 geht das natürlich nicht, da ich hier fürs Forum meinen Benutzername und das Passwort ersetzt habe mit den beiden Wörtern.
Habe eben den Inhalt meines Cookies hier 1:1 kopiert, alles in eine Zeile, eben so wie hier nur eben mit dem richtigen Benutzernamen.

Aber leider sehe ich immer den registirebutton, öffne ich die Seite dierekt ausm Browser is dieser nicht vorhanden da ich eben eingeloggt bin.


JayEff - Sa 29.04.06 15:34

user profile iconDeadlyAppearance hat folgendes geschrieben:
1:1 geht das natürlich nicht, da ich hier fürs Forum meinen Benutzername und das Passwort ersetzt habe mit den beiden Wörtern.
Habe eben den Inhalt meines Cookies hier 1:1 kopiert, alles in eine Zeile, eben so wie hier nur eben mit dem richtigen Benutzernamen.

-.- Ich selbstverständlich auch - oder soll ich meinen Benutzernamen & PW fürs Delphiforum veröffentlichen? -.~
...die Sterne stehen nicht mehr für die Beitragszahl... nich vergessen... -.-


DeadlyAppearance - Sa 29.04.06 15:53

KK, dann machen wir beide irgendwas falsch bei der Übergabe des Cookies. Schade das bis jetzt noch kein andere ne Idee oder Lösung hat.
Hmm, wie kommst du auf die Sterne und Beitragszahlen? Is mir eigentlich egal was da wo steht ^^.


raziel - Sa 29.04.06 17:17

Hab mal ein paar Tests durchgeführt:


Delphi-Quelltext
1:
2:
idHTTP1.CookieManager.AddCookie('test=bla''localhost');
  Memo1.Lines.Text := idHTTP1.Get('http://localhost/cookie.php');



cookie.php
1:
2:
3:
<?php
echo $_COOKIE['test'];
?>


Und nach dem Aufruf hatte ich "bla" im Memo stehen :arrow: Wird also übergeben. Anschließend ein Test mit einem lokal installierten phpBB, hat ebenfalls funktioniert (weglassen des Cookies sorgte für ausgeloggt sein).

Also liegt der Fehler bei euch in der Domainangabe (ohne http:// und abschließendem /), in einer fehlerhaften Eintragung der Cookie-Daten oder es werden noch mehr Cookies benötigt.

Gruß,
raziel


DeadlyAppearance - Sa 29.04.06 18:47

Ich könnte schwören es ging im Beispiel hier das Forum. Dann den Slahs am Ende weggemacht, wieder hin und nun bekomme ich es einfach nimmer hin. Ohh man.

Aber wie du ja gezeigt hast, gehen tut es auf jedenfall. Nun muss sich nurnoch der Knackpunkt finden warum es z.B. hier ans Forum nicht geht.


raziel - Sa 29.04.06 19:10

AllowCookies ist aber schon noch auf true gesetzt, oder? :zwinker:


DeadlyAppearance - Sa 29.04.06 19:27

user profile iconraziel hat folgendes geschrieben:
AllowCookies ist aber schon noch auf true gesetzt, oder? :zwinker:


Ja habe ich. Eben nochmal komplett alle Komponenten ausgetauscht etc. Aber es geht nicht.
Hast du es schonmal versucht hier mitm Forum? Denke is das beste Beispiel wo jeder drauf Zugriff hat. Vielleicht erklärt sich dann, warums auf anderen Seite auch nicht geht.


raziel - Sa 29.04.06 19:46

Funktioniert bei mir auch hier im Forum. Vorgehensweise:

  1. IdHTTP aufs Formular
  2. IdCookieManager aufs Formular
  3. CookieManager mit IdHTTP verbinden über Objektinspektor
  4. Memo aufs Forumlar
  5. Button aufs Formular, OnClick:

    Delphi-Quelltext
    1:
    2:
      IdHTTP1.CookieManager.AddCookie('df_data=*snip*''www.delphi-forum.de');
      Memo1.Lines.Text := IdHTTP1.Get('http://www.delphi-forum.de');


Funktioniert wunderbar :)


DeadlyAppearance - So 30.04.06 02:00


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.Button1Click(Sender: TObject);
var
  fn: TFileName;
  fs : TFileStream;
begin
  fn := 'C:\download.htm';
  fs := TFileStream.Create(fn, fmCreate);
  try
    IdHTTP1.CookieManager.AddCookie('df_data=*snip*''www.delphi-forum.de');
    IdHTTP1.Get('http://www.delphi-forum.de',fs);
  finally
    FreeAndNil(fs);
  end;
end;


Habs nun Step bei Step wie du gemacht und einmal in mein Beispiel eingefügt damit ers in ne Textdatei speichert. Jedesmal gelange ich nur auf die Loginseite. Ich verstehe es einfach nicht.
Was mache ich denn falsch?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt, Cookie-Daten entfernt.


JayEff - So 30.04.06 09:29

Ich vermute mal, das *snip* will mit irgentwas ersetzt werden (is na nirgens username und pw aufgetaucht ;> ). mit was denn genau? also ich meine wenn ichs mit "Der Benutzername ist JayEff, sein Passwort ist xxxXXXxxx, bitte log dich jetzt ein!" ersetze, klappts nich :'(


raziel - So 30.04.06 10:44

user profile iconJayEff hat folgendes geschrieben:
Ich vermute mal, das *snip* will mit irgentwas ersetzt werden (is na nirgens username und pw aufgetaucht ;> ).

Exakt, mit Hilfe des Cookies könnte man sich ja hier einloggen und jede Menge Unsinn treiben ;) Deshalb hab ichs vorsichtshalber mal entfernt. Wo nehmt ihr dann eure Cookies her? Ich hol meines ausm Firefox, Extras -> Einstellungen -> Datenscutz -> Cookies -> Cookies Anzeigen und dann bei Inhalt markieren, kopieren und in Delphi einfügen.


DeadlyAppearance - So 30.04.06 14:56

Geschafft habe ich es nun. Nun fehlts noch am Verständnis.
Habe nun die Cookies auch aus FF und nicht ausm IE. In Firefox gibt es 2 Cookies für dieses Forum.


Quelltext
1:
2:
3:
4:
5:
df_sid=8752acv472116vh5m098559be6a6h2ba

Jetzt:
df_data=*snip by raziel, siehe oben*
df_data=6%6j%22userid%ac%3Bs%fwf%3A%221338%fgwfB%7D


Die sid Ist nur bis Zum Ende der Sitzung gültig. Wenn ich diese jedoch nicht übergebe, geht es nicht. Ich gehe mal davon aus, das es sich hier um die SessionID handelt.
Nur diese ändert sich ja dedesmal. Muss ich die nun zwingend übergeben oder mache ich noch etwas falsch? Also so geht es auf jedenfall.
Und warum steht plötzlich im Cookie ein viel längerer String drin. Also irgendwie alles bissel hoch für mich ^^.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var
  fn: TFileName;
  fs : TFileStream;
begin
  fn := 'C:\download.htm';
  fs := TFileStream.Create(fn, fmCreate);
  try
    IdHTTP1.CookieManager.AddCookie('df_data=6%3A%22userid%22%3Bs%3A4%3A%221338%22%3B%7D''www.delphi-forum.de');
    IdHTTP1.CookieManager.AddCookie('df_sid=8752acv472116vh5m098559be6a6h2ba''www.delphi-forum.de');
    IdHTTP1.Get('http://www.delphi-forum.de',fs);
  finally
    FreeAndNil(fs);
  end;
end;



/edit
Nun gehts auch, wenn ich nur diese Zeile übergebe:

Delphi-Quelltext
1:
IdHTTP1.CookieManager.AddCookie('df_data=*snip by raziel*''www.delphi-forum.de');                    


Das ganze wird für mich immer komischer.

Moderiert von user profile iconmatze: Code- durch Delphi-Tags ersetzt
Moderiert von user profile iconraziel: Sicherheitsrelevante Cookie-Daten entfernt.


raziel - So 30.04.06 15:58

Ich hab mal wieder ein paar Cookie-Daten da oben entfernt. Wenn dir dein Account bei uns lieb ist, dann lass es bitte lieber künftig, die hier zu posten. Damit kann sich jeder hier unter deinem Namen einloggen und jede Menge Unsinn mit treiben, also pass un Zukunft besser ein bisschen auf ;)


DeadlyAppearance - So 30.04.06 16:11

KEine Angst, ich habe schon eine Zeichen mit Randomzeichen ersetzt. Ganz von Gestern bin ich ja auch noch net. Aber nur so kann man nachvollziehen was genau ich z.B. übergebe...


JayEff - So 30.04.06 16:50

@raziel
Naja ich dachte, du könntest die ungefäre struktur angeben, wie
"user_n=*snip*&pass=*snip*" oder sowas... -.- naja das wird jetzt zu OT ^^