Autor Beitrag
theCylus
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.04.09 00:05 
Hallo,
ich bin zwar neu hier, aber ich habe ganz brav das ganze Forum durchsucht... und leider keine Antwort auf meine Frage gefunden.

Ich möchte mich auf einer Internetseite mit Hilfe eines selbstgebauten Programms anmelden. Es geht lediglich um den einmaligen Login! Ich habe nicht vor, zu spammen oder andere illegale Sachen zu machen.

Es gibt auf der Startseite 2 Eingabefelder, plus einer Checkbox (immer eingeloggt bleiben) und einem "Login-Button". Ich denke, der Rest sollte nicht relevant sein, da es nichts gibt, was der User sonst noch ausfüllen kann. Zunächst mal der entsprechende HTML-Code und dann meine Lösung in Delphi.
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
<form action="login.php" method="post">
  <table  border='0'>
  <tr>
  <td width='270' align='right'><br><br><br><a href='?show=register#teaser'><img src='img/register.png' class='noborder'></a></td>
  <td>
            <table border='0' width='240' height='185' align='center' background="img/v1/menu/login.png">
              <tr>

                <td align='right'>
                  <br>
                  <br>
                  <br>
                  <br>
                  <br>
                </td>
    <td width='20'></td>
              </tr>

              <tr>
                <td align='right'>
                  <font size='1' face='verdana' color='#CCCCCC'>Nickname:</font><br>
                  <input type="text" size='20' name="username">
                </td>
                <td width='20'></td>
              </tr>
              <tr>

                <td align='right'>
                  <font size='1' face='verdana' color='#CCCCCC'>Passwort:</font><br>
                  <input type="password" size='20' name="pwd">
                </td>
                <td width='20'></td>
              </tr>
              <tr>
                <td align='right'>

                  <font size='1' face='verdana' color='#CCCCCC'>speichern?</font><input type='checkbox' name='auto'><input name="action" type="submit" value="Login"><br>

Mein Lösungsvorschlag lautet folgendermaßen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 IdHTTP: TIdHTTP;
  ParamData, PostDataStream : TStringStream;
  begin
   IdHTTP:= TIdHTTP.Create(nil);
   PostDataStream := TStringStream.Create('username=BLUBBER&password=BRAUSE&action=Login');
   ParamData := TStringStream.Create('');
   ParamData.WriteString('');
   IdHTTP.Post('http://DieStartseite.de/index.php', ParamData, PostDataStream);
   PostDataStream.Position := 0;
   Memo1.Text := PostDataStream.DataString;
  end;

Mein Lösungsvorschlag geht leider nicht. Ich habe diverse Beiträge gelesen, in denen das "&" als Variablentrennung im POST-String schuld sein soll. Vielleicht aber auch die Reihenfolge der Parameter oder einfach die .PHP-Datei, an die ich übertrage. "DieStartseite" ist in diesem Fall die Seite, auf der ich mich befinde, wenn ich die Eingabefelder sehe!
Kann mir jemand sagen, wo der Fehler liegt? Sollte ich die login.php aufrufen? Oder stimmen die POST-Daten nicht? Der HTML-Code ist ein Ausschnitt aus der Seite und absolut unverändert.

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 04.04.09 00:27 
Und um welches Browserspiel geht es diesmal, wofür jemand einen Bot schreiben will?
Bei so "ich möchte mich auf Internetseite XYZ einloggen, aber ich verrate euch nicht, welche es ist" bin ich immer seeehr misstrauisch.. nur selten kommt hierbei etwas "legales" (an den Regeln der entsprechenden Internetseite gesehen) bei raus.

_________________
PROGRAMMER: A device for converting coffee into software.
theCylus Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.04.09 01:05 
Es geht natürlich um kein Browserspiel. Es geht um eine ganz normale Internetseite, auf der eine Anmeldung notwendig ist. Die "Zensur" der URL fand lediglich aus Gründen des Datenschutzes statt. Ich möchte ja nicht, daß ein Bot die URL saugt und dann das Spammen anfängt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.04.09 01:19 
Naja, grundsätzlich schau dir einmal TIdHttp an, wie das geht siehst du z.B. in diesem Programm:
www.delphi-forum.de/viewtopic.php?t=91021
// EDIT: Dass du das benutzt, hatte ich irgendwie bei dir übersehen. Du solltest den Quelltext auch mit Delphi-Tags formatieren, dann sieht man das besser.

Etwas genaueres, also fertig zugeschnittenen Code, möchte ich ohne Kenntnis der Webseite auch nicht posten. Allerdings siehst du in dem Quelltext ja auch ein fertiges Beispiel.

Die Frage ist allerdings was nach dem Login passieren soll. Der verlinkte Quelltext holt z.B. nur den Quelltext der Ergebnisseite.

user profile icontheCylus hat folgendes geschrieben Zum zitierten Posting springen:
Die "Zensur" der URL fand lediglich aus Gründen des Datenschutzes statt. Ich möchte ja nicht, daß ein Bot die URL saugt und dann das Spammen anfängt.
Du kannst die Adresse der Website auch hier im Forum als Anhang in eine Textdatei schreiben. Anhänge können nur registrierte Benutzer abrufen und deren Inhalte können auch durch eine Suche nicht gefunden werden.


Zuletzt bearbeitet von jaenicke am Sa 04.04.09 01:47, insgesamt 1-mal bearbeitet
theCylus Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.04.09 01:32 
Vielen Danke für die Info!
Leider ist der genannte Thread bezüglich meiner Frage nicht ganz genau und am Ende muß ich trotzdem noch den Fehler in meinem Programm suchen. Die Seite um die es geht, habe ich angehängt. Ich würde mich freuen, wenn jemand einen Rat weiß. Ich gehe schwer davon aus, daß es nur ein paar falsche Zeichen sind oder eine falsche Reihenfolge der Postdaten o.ä.
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.04.09 01:44 
Ok, bei der Seite steht nichts dagegen in den Nutzungsbedingungen, also ist das ja ok.

Zwei Sachen fallen mir auf:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
 PostDataStream := TStringStream.Create('username=BLUBBER&password=BRAUSE&action=Login'); 
ParamData := TStringStream.Create(''); 
ParamData.WriteString(''); 
IdHTTP.Post('http://DieStartseite.de/index.php', ParamData, PostDataStream);
Der Parameter heißt pwd und die Datei login.php ;-)
theCylus Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.04.09 01:57 
OK, das war mein Fehler. Ich hab wohl vor lauter experimentieren eine "alte" Version des Codes gepostet. Die Variable ist SICHER pwd (siehe Quelltext).
Bei der index.php war ich mir nicht sicher, ob ich die Seite aufrufen muß, die die Loginfelder enthält, oder lieber die, die offensichtlich die Daten auswertet. (1. = index.php und 2. = login.php)
Beide Versuche waren jedoch erfolglos.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 04.04.09 02:38 
Du schreibst die Post-Parameter in den Stream, in den die resultierende Seite kommt (dritter Parameter), statt sie als Post-Parameter zu übergeben. Als Post-Parameter übergibst du nix (zweiter Parameter).

Vertausch mal ParamData und PostDataStream...
theCylus Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 04.04.09 02:45 
Also wenn das der Fehler war, dann entschuldige ich mich für die blöde Anfrage :) Manchmal sieht man den Wald vor lauter Bäumen nicht.. Ich poste das Ergebnis.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Das Vertauschen hat leider nichts gebracht. Das Ergebnis ist exakt das Gleiche.

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Um mir das Ganze mal etwas einfacher und verständlicher zu machen, habe ich einfach mal den relevanten Teil der Loginseite kopiert und eine einfache login.php geschrieben. Gebe ich im Browser einen beliebigen Benutzernamen und ein Kennwort ein, gibt die login.php beides per echo aus. Wenn ich allerdings mein Programm die Daten abschicken lasse, ist die Rückmeldung leer. Ich poste einfach mal meinen korrigierten Source und die login.php. Vielleicht/hoffentlich ist es ja nur ein kleiner, einfacher Fehler.

@jaenicke: Danke für deinen Tip mit den vertauschten Variablen.

Mein Source:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.Button1Click(Sender: TObject);
var
 IdHTTP: TIdHTTP;
 Rueckgabe, PostData : TStringStream;
 Username, Passwort : String;
  begin
   IdHTTP:= TIdHTTP.Create(nil);
   PostData := TStringStream.Create('');
   Rueckgabe := TStringStream.Create('');
   Rueckgabe.WriteString('');
   PostData.WriteString('username=USERNAME&pwd=PASSWORT&action=Login');
   IdHTTP.Post('http://postdata.kilu.de/login.php', PostData, Rueckgabe);
   PostData.Position := 0;
   Memo1.Text := Rueckgabe.DataString;
  end;

Die Auswertende login.php
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
<?php

$nachricht = 'Benutzername: ' . $_POST['username'] . "\r\n" . 'Passwort: ' . $_POST['pwd'];
echo($nachricht);

?>

Ich weiß natürlich nicht, wie die login.php auf dem Originalserver aussieht. Aber angesichts der Tatsache, daß es bei meiner login.php zum gleichen Ergebnis führt, wie beim Originalserver, vermute ich, der Aufbau ist ähnlich. Die Testseite ist postdata.kilu.de
Ich bin für jede Hilfe dankbar!
Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
theCylus Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: So 05.04.09 02:00 
Ich hoffe, es stört niemanden, wenn ich meine Frage jetzt selbst beantworte. Nach langem Suchen und Probieren, habe ich den Fehler gefunden. Ich muß vor "idHTTP.Post" noch "idHTTP.Request.ContentType:='application/x-www-form-urlencoded';" ausführen. Dann funktioniert das Ganze problemlos. Für diejenigen, die irgendwann mal das gleiche Problem haben, hier der funktionierende Source.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
 IdHTTP: TIdHTTP;
 Rueckgabe, PostData : TStringStream;
 Username, Passwort : String;
 begin
  IdHTTP:= TIdHTTP.Create(nil);
  PostData := TStringStream.Create('');
  Rueckgabe := TStringStream.Create('');
  Rueckgabe.WriteString('');
  PostData.WriteString('username=USERNAME&pwd=PASSWORT&action=Login');
  idHTTP.Request.ContentType:='application/x-www-form-urlencoded';
  IdHTTP.Post('http://postdata.kilu.de/login.php', PostData, Rueckgabe);
  PostData.Position := 0;
  Memo1.Text := Rueckgabe.DataString;
end;

Die POST-Daten, sowie die URL müssen angepasst werden. War ja nur ein Testserver. Vielen Dank für eure Hilfe!

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 05.04.09 02:02 
So war das in dem oben verlinkten Programm auch, ich dachte das hättest du dir angeschaut und ggf. ausprobiert. ;-)