Cookie aus einer externen Seite auslesen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfragen
antwort
auftauchen
auswerten
beispiel
datei
datum
fehler
frage
header
host
http
post
sache
senden
server
start
telnet
verbindung
zeile
-
Hallo!
Ich hab folgendes Problem: Wie kann ich das Cookie, welches erst dann erstellt wird, wenn die eine externe Seite (z.B. www.gibtsnicht.xx) besuche, auslesen?
Zur Information: Ich habs schon mit include(); versucht, brachte aber kein Erfolg, da ich direkt auf die Seite gelangt. ODer t?usche ich mich da, und das PHP-Script l?uft immer noch weiter?
compactdisc -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Irgendwie ist mir deine Frage immer noch nicht so ganz klar...
M?chtest du etwa in einem deiner Skripte das Cookie einer fremden Webseite auslesen? Irgendwie ergibt deine Frage anders keinen Sinn... *g* -
0-checka schrieb:
Irgendwie ist mir deine Frage immer noch nicht so ganz klar...
M?chtest du etwa in einem deiner Skripte das Cookie einer fremden Webseite auslesen? Irgendwie ergibt deine Frage anders keinen Sinn... *g*
Meine Frage ergibt - in meinen Verh?ltnissen gesehen - sehr viel Sinn *gg*
Ja, das hast Du so richtigt verstanden!
//edit:
Also, ich kann die Seite mit einem iframe einbinden, dass sie ein cookie erstellt. Leider ist das Cookie nur f?r die eingebundene Seite zug?nglich, also trage ich die Daten manuell ein........ -
Dazu musst du per Hand eine Socketverbindung zu dem Server herstellen, einen HTTP Request senden und dann die Antwort des Servers, in der dann das Cookie ?berliefert wird, auswerten.
Hier mal ne kurze Erkl?rung (erst zu HTTP-Kommunikation):
Nach Aufbau der Verbindung zu einem HTTP-Server wartet der Server auf die Anforderung. Die Anforderungen gibt es als HTTP 1.0 und HTTP 1.1 Version. Ich erkl?re mal nur die HTTP 1.1 Version, da durch das Hosten von mehreren Domains auf einem Server bei vielen Webseiten gar nichts anderes mehr m?glich ist.
Request an Server:
HEAD / HTTP/1.1\n
Host: www.lima-city.de\n
\n
Jedes \n soll einen Zeilenumbruch (Enter) darstellen. Durch die Zeile, in der nichts steht und die mit einem Zeilenumbruch beendet wird (also das letzte \n) weiss der Server, dass die Anforderung beendet ist und der Client nun auf die R?ckmeldung wartet. Der HTTP-Befehl HEAD liefert nur den HTTP-Header einer Seite zur?ck, statt wie bei dem Befehl GET die komplette Seite zu liefern. In diesem Fall fordern wir die Root-Seite des Webservers an (normalerweise index.*), willst du beipspielsweise www.lima-city.de/hallo.html abrufen, dann w?rdest du HEAD /hallo.html HTTP/1.1 senden.
Jetzt kommen also die Daten vom Server zur?ck. Ich hab das mal eben per Telnet gemacht. Hier die Antwort von www.lima-city.de:
HTTP/1.1 200 OK
Date: Mon, 14 Feb 2005 12:01:56 GMT
Server: Apache/1.3.26 (Unix) Debian GNU/Linux PHP/4.3.9
X-Powered-By: PHP/4.3.9
Set-Cookie: sid=42ba7f8ddb10ee467751114a44eb7d2a; path=/
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Last-Modified: Mon, 14 Feb 2005 12:02:03 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Und wie man sieht, wird der Cookie ?ber den HTTP-Header ?bertragen (beim Client ist es genauso, ein Client sendet Cookie-Informationen an einen Server auch im HTTP-Header).
In der ersten Zeile steht immer die Protokollversion (HTTP/1.1), Leerzeichen, Returncode, Leerzeichen, Fehler-/OK-Meldung. 200 bedeutet immer ok, 404 kennst du wahrscheinlich selber (File not found) und die restlichen Fehlercodes findest du im Netz. Auch die Antwort des Servers ist beendet, wenn er mit zwei Zeilenumbr?chen abschliesst.
Probier einfach mal bisschen per Telnet rum (START->Ausf?hren->"telnet www.lima-city.de 80" und Enter; telnet nimmt als ersten Parameter den Hostnamen, der zweite Parameter ist der Port zu dem man sich verbinden will; 80 ist der Standard HTTP-Port).
Das ganze Zeug musst du jetzt mit PHP machen. Es gibt keine vorgefertigten Funktionen daf?r.
Also:
- Mit dem Server verbinden
- HTTP-Request senden
- Server-Antwort empfangen
- Verbindung trennen
- Server-Antwort auswerten
Das Verbinden mit dem Server machst du per fsockopen(). Danach kannst du auf dem ge?ffneten Socket wie mit einer Datei arbeiten (unter Linux in C so ?blich), also zum Senden und Empfangen der Nachrichten fputs() und fgets() benutzen. Zum Beenden der Socket-Verbindung benutzt du einfach fclose(), als w?re der Socket eine Datei.
Die empfangene Antwort brauchst du dann ja nur noch nach einer Zeile zu durchsuchen, die mit "Set-Cookie: " beginnt und der Rest der Zeile ist dann der Cookie. -
<?
$fp = fsockopen ("www.xxxxxxx.com", 80, $errno, $errstr, 30);
if ($fp) {
// - HTTP-Request senden
// - Server-Antwort empfangen
// - Verbindung trennen
// - Server-Antwort auswerten
// aber wie?
}
else {
echo "error!";
}
?>
//edit:
Sollte das irgendwie mit dem header();-Befehl gehen? -
jetzt nochma ne frage @ o-checka:
ging es nich das in die datei reinzuschreiben, wo alle frames eingebunden werden?
@compactdisc:
sieht recht schwierig aus, entweder wartest du auf o-checka`s post, oder du machst deine page muit include(); -
jetzt nochma ne frage @ o-checka:
ging es nich das in die datei reinzuschreiben, wo alle frames eingebunden werden?
@compactdisc:
sieht recht schwierig aus, entweder wartest du auf o-checka`s post, oder du machst deine page muit include();
Mit include funktioniert nicht! Ausserdem weiss ich (denke ich) dass man die Anfrage mit header(); sendet, aber was ich senden muss, ist mir leider noch unklar..... -
@topic:
Beispiel: http://0-checka.pyrokar.lima-city.de/thread22507.php
Quelltext: http://0-checka.pyrokar.lima-city.de/thread22507.txt
@compactdisc:
Mit header() geht das nicht, weil header() nur Dinge an den Client raussendet, der gerade mit dem Server verbunden ist, auf dem das PHP-Skript l?uft.
@lucas9991:
1. Warten lohnt sich
2. Die Cookies, die dann gesendet werden, landen nur beim Client, nicht auf dem Server, wo das PHP-Skript ausgef?hrt wird. -
EDIT 0-checka: Zitat mit Kopie des im vorigen Post gezeigten Skriptes entfernt. Ende EDIT.
Das Script von 0-checka funktioniert f?r Lima-City.de sehr gut, aber leider nicht f?r meine Seite, die ich abfragen sollte^^ Fehler: 400 Bad Request
Zum Script:
Socket ?ffnen | OK
HTTP-Request senden | Dank 0-checka auch OK
Verbindung trennen | OK
Server antwort auswerten | Denke, dass das kein so grosses Problem werden wird, wenn ich erst die Daten habe
Aber wie muss ich jetzt die daten, welche im Cookie vorhanden sind, an den Server senden?
@0-checka
Kennst Du gute Tutorials/Links das von Sockets handelt? Das Thema scheint mir ziemlich interessant -
compactdisc schrieb:
Das Script von 0-checka funktioniert f?r Lima-City.de sehr gut, aber leider nicht f?r meine Seite, die ich abfragen sollte^^ Fehler: 400 Bad Request
Welche Seite ist das denn? Und hast du das mal manuell per Telnet versucht?
compactdisc schrieb:
Aber wie muss ich jetzt die daten, welche im Cookie vorhanden sind, an den Server senden?
Falls du die senden willst, benutzt du:
"Cookie: cookiename=cookiedaten" statt der Zeile mit "Set-Cookie".
compactdisc schrieb:
Kennst Du gute Tutorials/Links das von Sockets handelt? Das Thema scheint mir ziemlich interessant
Die besten Tutorials zu dem Bereich gibt es f?r C/C++. Da PHPs Socketkonzept an C angelehnt ist, solltest du dich erstmal da umschauen, um grundlegendes Verst?ndnis daf?r zu bekommen. Die Funktion fsockopen() ist keine orgin?re Socketfunktion, sondern eine Kapselung diverser echten Socketfunktionen, die auf BSD-Sockets basieren. Socketfunktionen unter PHP sind zur Zeit (ich glaube in der 5er Version auch) noch experimentell. Eine ?bersicht der wirklichen Socketfunktionen findest du unter http://www.php.net/manual/de/ref.sockets.php -
1. telnet funktioniert bei mir nicht (hab's auch mit lima-city.de versucht).
2. Es ist schon eine grosse Hilfe, wenn ich weiss, wie ich Cookie an den Server senden soll! Danke schon mal!
3. Warum wurden die Socketfunktionen in C programmiert? Gab es zu dieser Zeit noch kein C++? Oder wurden diese absichtlich in C programmiert?
//edit:
3. Weil C schon Sockets unterst?tzte und diese von C++ ?bernommen wurden?
-
compactdisc schrieb:
1. telnet funktioniert bei mir nicht (hab's auch mit lima-city.de versucht).
Dann machst du was falsch.
compactdisc schrieb:
3. Warum wurden die Socketfunktionen in C programmiert? Gab es zu dieser Zeit noch kein C++? Oder wurden diese absichtlich in C programmiert?
//edit:
3. Weil C schon Sockets unterst?tzte und diese von C++ ?bernommen wurden?
Lies nochmal durch, was ich geschrieben habe, hast da wohl was falsch verstanden.
Anscheinden geht ja jetzt alles, da du weder sagst, mit welcher Seite du Probleme hast, noch f?r diesen Thread relevante Fragen stellst, oder? -
ok, nein, leider funktioniert nicht alles reibungslos...
@0-checka
Lies nochmal durch, was ich geschrieben habe, hast da wohl was falsch verstanden.
Allerdings! Ich dachte n?mlich, dass PHP mit Hilfe von C/C++ programmiert wurde....also dass auch so die Socket-Funktionen ?bernommen wurden......
------------------------------------
Dann machst du was falsch.
Was denn? Start->Ausf?hren->"telnet www.lima-city.de 80"
oder Start->Ausf?hren->"cmd"->"telnet www.lima-city.de 80"
Was ist denn da falsch?
-----------------------------------
Anscheinden geht ja jetzt alles, da du weder sagst, mit welcher Seite du Probleme hast, noch f?r diesen Thread relevante Fragen stellst, oder?
also: Ich m?chte mich bei der Seite http://www.schoolnet.ch einloggen, dazu ben?tige ich aber die HTTP-Header-Informationen, die ich jetzt dank Dir, 0-checka (danke ?brigens!), abrufen kann!
Des Weiteren muss ich das Cookie wieder zur?ckschicken (an den Server).
"Cookie: cookiename=cookiedaten" -> Hab ich dann so versucht, kam auch keine Fehlermeldung......Quellcode dazu:
$fp = fsockopen($hostname, $port, $errno, $errstr, 30);
if ($fp) {
$request = "Cookie: ASP.NET_SessionId=$wert";
$ret = fputs($fp, $request);
}
else {
echo "Fehler!";
}
Frage: Reicht es, wenn die Variable $request nur "Cookie: ASP.NET_SessionId=$wert" ent?lt, oder muss ich da noch diverse Dinge hinzuf?gen?
cd -
Erst mal vorweg, mir ist aufgefallen, das ich in meinem Script einen Fehler habe. Ersetz einfach die Stellen, wo \n steht mit \r\n. Bin gerade zuf?llig dr?ber gestolpert, weil ich wegen was anderem im entsprechenden RFC gelesen habe.
compactdisc schrieb:
Allerdings! Ich dachte n?mlich, dass PHP mit Hilfe von C/C++ programmiert wurde....also dass auch so die Socket-Funktionen ?bernommen wurden......
Ja, aber was hat das mit C oder C++ und der ?bernahme der Socketfunktionen von C nach C++ zu tun? Nix.
compactdisc schrieb:
Start->Ausf?hren->'telnet www.lima-city.de 80'
oder Start->Ausf?hren->'cmd'->'telnet www.lima-city.de 80'
Was ist denn da falsch?
Nix. Danach machst du wohl was falsch.
compactdisc schrieb:
also: Ich m?chte mich bei der Seite http://www.schoolnet.ch einloggen, dazu ben?tige ich aber die HTTP-Header-Informationen, die ich jetzt dank Dir, 0-checka (danke ?brigens!), abrufen kann!
Des Weiteren muss ich das Cookie wieder zur?ckschicken (an den Server).
'Cookie: cookiename=cookiedaten' -> Hab ich dann so versucht, kam auch keine Fehlermeldung......Quellcode dazu:
[... dein Quellcode ...]
Frage: Reicht es, wenn die Variable $request nur 'Cookie: ASP.NET_SessionId=$wert' ent?lt, oder muss ich da noch diverse Dinge hinzuf?gen?
Auf jeden Fall musst du noch was dazuf?gen. Jedes mal, wenn du einen HTTP-Request losschickst, dann muss das mindestens in folgender Form sein:
XXX HTTP/1.1\r\n
Host: www.hostname-exmpl.tr\r\n
\r\n
Dazu kann man dann optional noch mehr Sachen dranh?ngen (nat?rlich vor der letzten Zeile, die nur "\r\n" lautet). Zum Beispiel halt "Cookie: name:daten\r\n" oder sonstwas (da gibts noch ne ganze Menge mehr).
Nachtrag:
Hab v?llig vergessen XXX beim Beispiel kann folgende Formen annehmen:
GET
HEAD
POST
Es gibt bei HTTP 1.1 zwar noch paar andere Methoden, aber die d?rften wohl erstmal nicht von Interesse sein. -
Erst mal vorweg, mir ist aufgefallen, das ich in meinem Script einen Fehler habe. Ersetz einfach die Stellen, wo \n steht mit \r\n. Bin gerade zuf?llig dr?ber gestolpert, weil ich wegen was anderem im entsprechenden RFC gelesen habe.
Also so?
HEAD / HTTP/1.1\r\n
was bedeutet das "/" nach HEAD?
-----------------------------------------
Ja, aber was hat das mit C oder C++ und der ?bernahme der Socketfunktionen von C nach C++ zu tun? Nix.
Ich habs auch falsch verstanden.....
-------------------------------------------
Nix. Danach machst du wohl was falsch.
Juhui, ich mach was richtig^^
Ich warte danach!?
------------------------------------------
Auf jeden Fall musst du noch was dazuf?gen. Jedes mal, wenn du einen HTTP-Request losschickst, dann muss das mindestens in folgender Form sein:
XXX HTTP/1.1\r\n
Host: www.hostname-exmpl.tr\r\n
\r\n
Ok, mach ich! Gibts auch ein H?CHSTENS? Was k?nnte man an Stelle der X-en noch hinsetzen, ausser HEADER?
--------------------------------------------------------
Dazu kann man dann optional noch mehr Sachen dranh?ngen (nat?rlich vor der letzten Zeile, die nur "\r\n" lautet). Zum Beispiel halt "Cookie: name:daten\r\n" oder sonstwas (da gibts noch ne ganze Menge mehr).
Cookie: name:daten\r\n
In einem anderen Post hast Du mir gesagt, dass das "Cookie: name=wertdescookies" heisst, was nun?
Dazu kann man dann optional noch mehr Sachen dranh?ngen (nat?rlich vor der letzten Zeile, die nur "\r\n" lautet).
Ist das auch irgendwo verzeichnet?
cd
-
compactdisc schrieb:
Also so?
HEAD / HTTP/1.1\r\n
Ja, aber auch im Rest des Skriptes, also bei der ?berpr?fung der Serverantwort etc. auch. Ich hab einfach mal mein Beispielskript korrigiert, schau im Zweifelsfall darein.
compactdisc schrieb:
was bedeutet das '/' nach HEAD?
Das ist der Pfad. / ist der Wurzelpfad, also www.lima-city.de/ <--- das letzte Teil da. Wenn du www.lima-city.de/boards abfragen willst, dann nimmste:
GET /boards HTTP/1.1
Host: www.lima-city.de
compactdisc schrieb:
Juhui, ich mach was richtig^^
Ich warte danach!?
Na einfach das eingeben, was sonst das PHP-Skript schicken w?rde... Statt \r\n machst du einfach Enter.
compactdisc schrieb:
Ok, mach ich! Gibts auch ein H?CHSTENS? Was k?nnte man an Stelle der X-en noch hinsetzen, ausser HEADER?
Ich habe es im vorigen Post nachgetragen.
Die fehlenden Dinge kannst du dir aus dem RFC 2616 rauslesen.
compactdisc schrieb:
Cookie: name:daten\r\n
In einem anderen Post hast Du mir gesagt, dass das 'Cookie: name=wertdescookies' heisst, was nun?
Ein Cookie kann aus mehreren Teilen bestehen. Jeder Teil hat einen Namen und einen Wert. Cookie kann in einem HTTP-Header mehrmals auftauchen. Bei jedem Auftauchen sieht das so aus:
Cookie: xyz:123\r\n
xyz steht f?r den Namen des Cookieteils, den man schicken will.
123 steht f?r die entsprechenden Daten (oder der Wert oder nenne es wie du Bock hast).
Wenn du immer noch nicht genau verstanden hast, wie das jetzt gemeint ist, dann schau dir mal in der PHP-Doku die Erkl?rung zu SetCookie() an. Vielleicht wird dir das dann etwas klarer.
compactdisc schrieb:
Dazu kann man dann optional noch mehr Sachen dranh?ngen (nat?rlich vor der letzten Zeile, die nur '\r\n' lautet).
Ist das auch irgendwo verzeichnet?
RFC 2616 und den darin aufgef?hrten RFCs (z.B. das RFC zu MIME)
-
Zitat:
compactdisc schrieb:
Also so?
Zitat:
HEAD / HTTP/1.1\r\n
Ja, aber auch im Rest des Skriptes, also bei der ?berpr?fung der Serverantwort etc. auch. Ich hab einfach mal mein Beispielskript korrigiert, schau im Zweifelsfall darein.
Hab ich gemacht......aber warum hat die ganze HTTP-Abfrage mit Lima-city funktioniert, obwohl zuerst nur "\n" stand?
Das ist der Pfad. / ist der Wurzelpfad, also www.lima-city.de/ <--- das letzte Teil da. Wenn du www.lima-city.de/boards abfragen willst, dann nimmste:
GET /boards HTTP/1.1
Host: www.lima-city.de
cool :xyxthumbs:
Ein Cookie kann aus mehreren Teilen bestehen. Jeder Teil hat einen Namen und einen Wert. Cookie kann in einem HTTP-Header mehrmals auftauchen. Bei jedem Auftauchen sieht das so aus:
Cookie: xyz:123\r\n
xyz steht f?r den Namen des Cookieteils, den man schicken will.
123 steht f?r die entsprechenden Daten (oder der Wert oder nenne es wie du Bock hast).
Wenn du immer noch nicht genau verstanden hast, wie das jetzt gemeint ist, dann schau dir mal in der PHP-Doku die Erkl?rung zu SetCookie() an. Vielleicht wird dir das dann etwas klarer.
dann sende ich das Cookie so: "Cookie xyz:wert" ab, richtig?
RFC 2616 und den darin aufgef?hrten RFCs (z.B. das RFC zu MIME)
Ich hab den Link verloren!
cd -
compactdisc schrieb:
Hab ich gemacht......aber warum hat die ganze HTTP-Abfrage mit Lima-city funktioniert, obwohl zuerst nur "\n" stand?
Manche Webbrowser nehmen Fehler nicht so krumm wie andere.
compactdisc schrieb:
dann sende ich das Cookie so: "Cookie xyz:wert" ab, richtig?
Wenn der Cookie xyz heisst, dann ja.
compactdisc schrieb:
RFC 2616 und den darin aufgef?hrten RFCs (z.B. das RFC zu MIME)
Ich hab den Link verloren!
http://www.rfc-editor.org dort in der RFC Database nach dem RFC mit der Nummer 2616 schauen. -
compactdisc schrieb:
Hab ich gemacht......aber warum hat die ganze HTTP-Abfrage mit Lima-city funktioniert, obwohl zuerst nur "\n" stand?
Manche Webbrowser nehmen Fehler nicht so krumm wie andere.
ServerOS von schoolnet.ch ist Windows
compactdisc schrieb:
dann sende ich das Cookie so: "Cookie xyz:wert" ab, richtig?
Wenn der Cookie xyz heisst, dann ja.
OK!
compactdisc schrieb:
RFC 2616 und den darin aufgef?hrten RFCs (z.B. das RFC zu MIME)
Ich hab den Link verloren!
http://www.rfc-editor.org dort in der RFC Database nach dem RFC mit der Nummer 2616 schauen.
Hab den Link gesucht und das Entsprechende dazu gefunden, vielen Dank!
Ich denke, vorerst sind alle Fragen gekl?rt^^ Vielen Dank an 0-checka!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage