HTTP-Request "abfangen", manipulieren und senden
thecreep
- php
0 ChrisB0 thecreep0 Der Martin
0 thecreep
0 dedlfix
Hallo,
hier gleich meine Situation und folgend meine Frage.
Ich habe ein Formular mit POST-Daten. Nun möchte ich wissen, wie in welcher Form sie an einen Server geschickt werden. Also quasi die Header-Daten (wenn ich das nich ganz falsch verstanden habe).
Dann möchte ich diese manipulieren und dann schicken und die Antwort vom Server erhalten.
Gibt es Möglichkeiten, dies unter PHP zu realisieren?
MfG
thecreep
Hi,
Ich habe ein Formular mit POST-Daten. Nun möchte ich wissen, wie in welcher Form sie an einen Server geschickt werden. Also quasi die Header-Daten (wenn ich das nich ganz falsch verstanden habe).
Dann nimm dir Firebug, und schau's dir an.
Dann möchte ich diese manipulieren und dann schicken und die Antwort vom Server erhalten.
Gibt es Möglichkeiten, dies unter PHP zu realisieren?
Google: php post2host
MfG ChrisB
Mit dem Post2Host hab ich mich auseinandergesetzt, nun hab ich folgenden Code vollbracht:
$data="login[ts]=$TS&login[key]=$KEY&login[u]=xxx&login[p]=xxx";
$host=parse_url("http://www.jappy.de/password");
$host=$host['host'];
$con = fsockopen($host,80);
fputs($con,"POST /password HTTP/1.1\r\n");
fputs($con,"Host: $host\r\n");
fputs($con,"Content-Type: application/x-www-form-urlencoded\r\n");
fputs($con,"Content-Length: ".strlen(data)."\r\n\r\n");
fputs($con,$data);
$content="";
while (!feof($con))
$content.=fgets($con,128);
fclose($con);
echo $content;
Bedauerlicher Weise ist mein $content immer leer :-| Woran liegt das?
MfG
thecreep
Hallo,
$data="login[ts]=$TS&login[key]=$KEY&login[u]=xxx&login[p]=xxx";
$host=parse_url("http://www.jappy.de/password");
$host=$host['host'];
warum einfach, wenn's umständlich auch geht. ;-)
Den Hostnamen direkt anzugeben, war wohl zu trivial?
$con = fsockopen($host,80);
Bekommst du hier eine gültige Verbindung? - Falls nicht, ist der ganze folgende Rattenschwanz sinnlos.
fputs($con,"POST /password HTTP/1.1\r\n"); fputs($con,"Host: $host\r\n"); fputs($con,"Content-Type: application/x-www-form-urlencoded\r\n"); fputs($con,"Content-Length: ".strlen(data)."\r\n\r\n"); fputs($con,$data);
Das sieht soweit korrekt aus.
$content=""; while (!feof($con)) $content.=fgets($con,128); fclose($con); echo $content;
Bedauerlicher Weise ist mein $content immer leer :-|
Was heißt leer? Mindestens die HTTP-Header der Antwort müsstest du kriegen, oder die Verbindung ist tatsächlich fehlgeschlagen (siehe oben).
So long,
Martin
Was heißt leer? Mindestens die HTTP-Header der Antwort müsstest du kriegen, oder die Verbindung ist tatsächlich fehlgeschlagen (siehe oben).
So long,
Martin
Also ich denke mal, dass die Verbindung besteht. Ansonsten müsste ja so eine Fehlermeldung ausgegeben werden:
Warning: fputs() expects parameter 1 to be resource, boolean given in C:\Programme\xampp\htdocs\bot.php on line X
Oder?
Zusatzlich hab ich mal var_dump($con) aufgerufen und siehe da:
resource(5) of type (stream)
Die Verbindung besteht.
Da ich nur $content ein mal ausgebe und der Quelltext komplett leer ist, kommen auch keine Header-Daten zurück :-/
Hallo,
Was heißt leer? Mindestens die HTTP-Header der Antwort müsstest du kriegen, oder die Verbindung ist tatsächlich fehlgeschlagen (siehe oben).
Also ich denke mal, dass die Verbindung besteht. Ansonsten müsste ja so eine Fehlermeldung ausgegeben werden:
Warning: fputs() expects parameter 1 to be resource, boolean given in C:\Programme\xampp\htdocs\bot.php on line X
Oder?
hmm, wo er recht hat ...
Zusatzlich hab ich mal var_dump($con) aufgerufen und siehe da:
resource(5) of type (stream)
Die Verbindung besteht.
Okay, das hätten wir also.
Was passiert, wenn du denselben Request mit einem Browser absetzt? Hast du mal versucht, ein HTML-Formular zu schreiben, das genau die Feldnamen und Inhalte hat, und das per POST abzuschicken?
Diesen Request und die zugehörige Antwort würde ich dann z.B. mit Firebug oder der LiveHTTP-Extension beobachten. Wenn dasselbe passiert, wie bei deinem PHP-Script (also gar keine Antwort), dann brauchst du nicht weiter zu suchen - dann reagiert der angesprochene Server nicht korrekt.
Andernfalls musst du mal die vom Browser gesendeten Header und die von deinem Script auf Unterschiede untersuchen.
So long,
Martin
Was passiert, wenn du denselben Request mit einem Browser absetzt? Hast du mal versucht, ein HTML-Formular zu schreiben, das genau die Feldnamen und Inhalte hat, und das per POST abzuschicken?
Hmmm hab alles mit meine Zeug gefüllt und es klappt
Diesen Request und die zugehörige Antwort würde ich dann z.B. mit Firebug oder der LiveHTTP-Extension beobachten. Wenn dasselbe passiert, wie bei deinem PHP-Script (also gar keine Antwort)
Hmmm ... ich hab keine Ahnung wie das mit Firebug geht, header auszugeben :(
Aber Ansich kommt eine Rückmeldung.
Also ist mein Primäres Problem jetzt, dass ich den Header noch nicht gesehen hab den mein Browser schick.
Wie geht das mit Firebug?
MfG
thecreep
Okay dedlfix hat mir den Fehler gezeigt >.<
Hab die ganze zeit mit $content gearbeitet und $CONTENT ausgeben.
Ach ich bin viel zu sehr Pascal-verwöhnt :?
Nun denn, Problem gelöst Danke für eure Hilfe!
MfG
thecreep
Hi!
Okay dedlfix hat mir den Fehler gezeigt >.<
Hab die ganze zeit mit $content gearbeitet und $CONTENT ausgeben.
Was? Dabei hatte ich doch diesmal noch gar nicht empfohlen, beim Entwickeln das error_reporting auf E_ALL zu stellen, damit solche Fehler angezeigt werden.
Hmmm ... ich hab keine Ahnung wie das mit Firebug geht, header auszugeben :(
Dazu muss man zuerst Firebug an sich aktivieren und dort dann auch noch "Netzwerk". Zudem muss man, wenn man es nicht in einem extra-Fenster geöffnet hat, auch noch das am unteren Browserfensterrand klebende Firebug vergrößern. Nun noch den Request absetzen ...
Lo!
Hi!
Nun noch den Request absetzen ...
... und dabei feststellen, dass mir Firebug im Gegensatz zur livehttpheaders-Extension die Post-Daten bereits in interpretierter Form und nicht in Rohform liefert.
Lo!
Hi!
Nun noch den Request absetzen ...
... und dabei feststellen, dass mir Firebug im Gegensatz zur livehttpheaders-Extension die Post-Daten bereits in interpretierter Form und nicht in Rohform liefert.
Hmmm dabei hab ich noch ein kleines, aber schwer wiegendes, Problem, um die Header-Daten zusehen die mein Browser schickt.
Ich schick ja meine HTTP-Anfrage zum Script www.jappy.de/password, nun ist es aber so, dass /password eine automatische Weiterleitung auslöst, so dass ich den eigentlichen Anfrage-Header nicht sehe, sondern den der die Weiterleitung anfordert. Kann man solche automatischen Weiterleitungen unterbinden? (Ich schätze mal das einfach "Location: /andere/seite.php" gesetzt wird)
MfG
thecreep
Hi!
Kann man solche automatischen Weiterleitungen unterbinden? (Ich schätze mal das einfach "Location: /andere/seite.php" gesetzt wird)
Kann man sicher im Firefox irgendwo unterbinden, muss man aber nicht. Die livehttpheaders-Extension kennt auch einen Mitschnitt-Modus, der alle Anfragen und Antworten aufzeichnet.
Lo!
Hallo,
nun ist es aber so, dass /password eine automatische Weiterleitung auslöst, so dass ich den eigentlichen Anfrage-Header nicht sehe, sondern den der die Weiterleitung anfordert.
was machst du denn da?
Ich sehe im Fenster der LiveHTTP-Extension in so einem Fall
* den ursprünglichen Request vom Firefox mit den POST-Daten
* den Response mit Status 301 (Redirect)
* den zweiten Request vom Firefox
* den zweiten Response vom Server
Wenn allerdings der Server ein Redirect "anordnet", dann müsste auch dein Script diesen HTTP-Response-Header mit Status 301 empfangen, in dem als Location-Header auch das Ziel der Weiterleitung steht.
Kann man solche automatischen Weiterleitungen unterbinden? (Ich schätze mal das einfach "Location: /andere/seite.php" gesetzt wird)
Ähm, AFAIK nein. Man kann dem Browser zwar beibringen, eine Weiterleitung per meta-Element im Dokument zu ignorieren; die Weiterleitung per HTTP-Header lässt sich aber meines Wissens nicht deaktivieren.
Dein Post2Host-Script dürfte davon natürlich unbeeindruckt sein - es bekommt (theoretisch) einen Redirect-Header als Antwort, interpretiert ihn jedoch nicht.
Ciao,
Martin
Dein Post2Host-Script dürfte davon natürlich unbeeindruckt sein - es bekommt (theoretisch) einen Redirect-Header als Antwort, interpretiert ihn jedoch nicht.
Ja das stimmt :) aber mein Problem ist das ich einige Daten, die relevant sind nich schicke, aber nicht weiß welche das sind, wo ich wieder beiom Firebug-Prob wäre
Okay das alte Problem, war für mich gelöst.
Da ich dachte, dass es als neues Thema mehr Sinn hat hatte ich ein neues Thema erstellt:
Header GZip Daten decodieren, da das wohl doch nicht so sinnvoll war möchte ich mich dafür entschuldigen :?
Nun dann, damit man nich nochmal hin und her klicken muss noch mal mein Problem:
Ich bekomme beim Header ein Vary, welches mit GZip kodiert ist. Das habe ich jetzt schon in eine eigene Variable (Zeichenkette) gespeichert. PHP.net bietet mir nun aber nur Funktionen an, bei denen ich GZip-Dateien arbeite, was ja für mich eher unpraktisch ist. Da ich auch relativ oft GZip-Daten bekomme, macht es in meinen Augen keinen Sinn, die Daten in eine temporäre Datei zu speichern, sie zu verwenden und dann wieder zu löschen.
Gibt es da noch andere Möglichkeiten?
MfG
thecreep
Hallo,
Ich bekomme beim Header ein Vary, welches mit GZip kodiert ist.
das liegt daran, dass du im Request behauptest, HTTP 1.1 zu sprechen. Dann musst du aber auch entweder konkret angeben, welche Encodings du haben willst (Accept-Encoding im Request), oder alles akzeptieren, was da kommen mag.
Aus der Spec für HTTP 1.1 (RFC 2616, Abschnitt 14.3:
If no Accept-Encoding field is present in a request, the server MAY assume that the client will accept any content coding.
So long,
Martin
das liegt daran, dass du im Request behauptest, HTTP 1.1 zu sprechen. Dann musst du aber auch entweder konkret angeben, welche Encodings du haben willst (Accept-Encoding im Request), oder alles akzeptieren, was da kommen mag.
Naja ich wollte ja GZip haben, das laut 'nem Bekannten eine gute Komprimierung hat. Dass er mir nich sagen kann, wie ich es wieder dekodiere hab ich erst hinterher gemerkt :S
Was müsste ich denn bei "Accept-Encoding" schreiben, dass ich die Daten unkodiert erhalte? (hab da nich so die Ahnung, setzt mich erst seit kurzen mit Headern auseinander :?)
MfG
thecreep
Nachtrag:
wenn ich text/plain verwende, werder ich weitergeleitet, was aber nicht passieren soll :-/
wenn ich text/plain verwende, werder ich weitergeleitet, was aber nicht passieren soll :-/
Okay funktioniert jetzt, ich hatte vergessen header("Content-Type: text/plain") aufzurufen :?
MfG
thecreep
Hi,
PHP.net bietet mir nun aber nur Funktionen an, bei denen ich GZip-Dateien arbeite, was ja für mich eher unpraktisch ist.
Ein *bisschen* selber umschauen, wenn man erst mal im Kapitel über die gzip-Funktionen gelandet ist (und das ist man, wenn man sich irgendeine dieser Funktionen anschaut, auch wenn's noch die falsche ist) - ist das wirklich zu schwer?
gzdecode
Da ich auch relativ oft GZip-Daten bekomme, macht es in meinen Augen keinen Sinn, die Daten in eine temporäre Datei zu speichern, sie zu verwenden und dann wieder zu löschen.
Unabhängig davon, dass man das im konkreten Szenario nicht braucht - zumindest um das Löschen muss man sich nicht selber kümmern, wenn man mal eine Tempdatei braucht. tmpfile() existiert.
MfG ChrisB
Ich schick ja meine HTTP-Anfrage zum Script www.jappy.de/password, nun
Schaut man sich die genannte Ressource einmal an, drängt sich die Frage auf, ob Du Gutes im Schilde führst....
Schaut man sich die genannte Ressource einmal an, drängt sich die Frage auf, ob Du Gutes im Schilde führst....
Hmmm, entscheide selbst, ich möchte ein Autologin schreiben. Das ganze soll dann aber noch erweitert werden, dass ich mit meinem Account nen bssl mehr Spaß haben kann (natürlich soll alles legal bleiben)
MfG thecreep
Hi,
Okay dedlfix hat mir den Fehler gezeigt >.<
Hab die ganze zeit mit $content gearbeitet und $CONTENT ausgeben.
Ach ich bin viel zu sehr Pascal-verwöhnt :?
Nein, du hast nur keinen Schimmer von grundlegenden Fehlersuch-Strategien.
MfG ChrisB
Nein, du hast nur keinen Schimmer von grundlegenden Fehlersuch-Strategien.
Ja, das mit Sicherheit auch, aber aus Fehlern lernt man ja bekanntlich. Irgendwann bekomm ich das (hoffentlich) auch gebacken :?
Hi!
$data="login[ts]=$TS&login[key]=$KEY&login[u]=xxx&login[p]=xxx";
Wie sieht das aus, wenn es fertig ist? Hast du Kontextwechsel beachtet?
$con = fsockopen($host,80);
Warum wertest du nicht aus, ob Fehler aufgetreten sind? Wenn PHP erst eine Meldung ausgeben muss, hast du als Programmierer nicht robust genug gearbeitet.
fputs($con,"POST /password HTTP/1.1\r\n");
Bist du sicher, dass du mit einer 1.1er Antwort umgehen kannst, auch wenn sie chunked ist? Wenn nicht, frag lieber nach HTTP/1.0.
Bedauerlicher Weise ist mein $content immer leer :-| Woran liegt das?
Vermutlich an der falschen Schreibweise von "bedauerlicherweise". :-) Wenn du eine Anfrage mit einem herkömmlichen Browser machst, geht diese? Was ist in dem Fall der Unterschied in der Kommunikation zu deinem Versuch?
Lo!