Die Simulation einer POST mit PHP & cURL
Ich versuche zu simulieren, die einen BEITRAG zu einer website, basierend auf was ich kommen sehe, aus HTTP Live headers im Firefox.
Hier ist ein kopieren/einfügen der log aus der Firefox plugin:
POST /Kontext?tab=login HTTP/1.1
Host: website
User-Agent:
Mozilla/5.0 (X11; U; Linux i686;
en-US; rv:1.9.2.13) Gecko/20101206
Ubuntu/10.10 (maverick)
Firefox/3.6.13
Übernehmen:
text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Anschluss:
keep-alive
Referer: referer
Cookie: fontsize=2;
JSESSIONID=0000pXE_BK7TjZFzEyNHqOKzXz2:-1
Content-Type:
application/x-www-form-urlencoded
Content-Length: 46
loginid=password&password=password&login=Login
Und die Antwort folgt sofort nach dem POST:
HTTP/1.1 302 Found
Ort:
website/Kontext?tab=p00689
Content-Language: en-US
Set-Cookie:
JSESSIONID=0000oaKlIeeDRWkX5YCiJu5v1lM:-1;
Path=/
Transfer-Encoding:
chunked
Datum: Mon, 07 Feb 2011
14:15:21 GMT
Server: WebSphere
Application Server/6.1
Abläuft:
Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie",
set-cookie2"
Basierend auf meinen Tests, eine Antwort, die Umleitungen zu
website/Kontext?tab=p00689
Bedeutet, dass der Nutzer authentifiziert wurde und alles funktionierte einwandfrei.
Aber, wenn man versucht, dies zu erreichen über PHP & cURL, bin ich auf eine Seite umgeleitet, die dem Benutzer darüber informiert, dass Ihre Sitzung abgelaufen ist.
Hier der code:
//Provider only likes Firefox
$agent = "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13";
ini_set("user_agent", $agent);
//Cookie
$cookie = tempnam("/tmp", "curlcookie");
//Post everything that was posted to me.
$fields = $_POST;
foreach($fields as $key=>$value)
{
$fields_string .= "$key=$value&";
}
$fields_string = substr($fields_string, 0, strlen($fields_string) - 1);
//Custom headers
$headers = array(
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language: en-us,en;q=0.5",
"Accept-Encoding: gzip,deflate",
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7",
"Keep-Alive: 115",
"Connection: keep-alive");
//cURL options
$ch = curl_init("website");
curl_setopt($ch, CURLOPT_REFERER, "referer");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$output = curl_exec($ch);
$header = curl_getinfo($ch);
curl_close($ch);
//Debugging junk
echo nl2br($header["request_header"]);
echo "<br/><br/>Output:<br/><br/>$output";
Die Ausgabe dieses Skripts lautet wie folgt:
POST /Kontext?tab=login HTTP/1.1
User-Agent: User-Agent: Mozilla/5.0
(X11; U; Linux i686; en-US;
rv:1.9.2.13) Gecko/20101206
Ubuntu/10.10 (maverick)
Firefox/3.6.13
Host: website
Pragma: no-cache
Referer:
referer
Übernehmen:
text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:
ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Anschluss:
keep-alive
Content-Length:
46
Content-Type:
application/x-www-form-urlencodedloginid=username&Passwort=Passwort&login=Login
Ausgang:
HTTP/1.1 302
Fand
Lage:website/Kontext?tab=p00697
Content-Language: en-US Set-Cookie:
JSESSIONID=0000Tl8NL1Hg2dbNv_PEnq-bbvr:-1;
Path=/Set-Cookie:
JSESSIONID=0000Zue58y1tXg3tt4XjB8exXw6:-1;
Path=/Transfer-Encoding: chunked
Datum: Mon, 07 Feb 2011 19:18:20 GMT
Server: WebSphere Application
Server/6.1 Expires: Thu, 01 Dec 1994
16:00:00 GMT Cache-Control:
no-cache="set-cookie
set-cookie2"
Basierend auf dem, was ich gepostet habe, ist es etwas offensichtlich, dass ich bin fehlt? Was sollte ich als Nächstes versuchen? Die Anfragen schauen Sie semantisch das gleiche; ich bin mir nicht sicher, was ich tun könnte falsch.
Der cookie ist erforderlich, damit der post komplett ist nicht von server 1, aber der Ziel-server als cookie erstellt auf dem login-Zeitpunkt. ich glaube,
Richtig, RobertPitt. Danke für die Kommentare.
Sieht aus wie ich war nicht klar. Der original-BEITRAG, der gezeigt hat, ein Cookie-header. Die hergestellten POST nicht. Wenn der server ein cookie gesetzt (und die Beurteilung durch 'JSESSIONID') kann es einige damit verbundenen Daten, insbesondere session/user, die einen Fehler verursacht, wenn die hergestellten POST hat der server auch ohne cookie
Guter Punkt, Tippfehler.. ich werde versuchen, und sehen, was passiert.
InformationsquelleAutor Ian P | 2011-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die eine Sache, die auffällt, ist folgende Zeile des Codes:
Nun, wenn dies fehlschlägt, erstellen Sie die Datei dann
tempnam
würde false zurückgeben, was bedeutet, dass die folgenden Zeilen von code:sind so gut wie nicht eingestellt haben, sollten Sie die cookie-Datei in das gleiche Verzeichnis wie die Ausführung des Skripts.
die nächste Sache ist:
Brauchen Sie nicht zu tun, da
CURLOPT_POSTFIELDS
akzeptiert ein array, so dass Sie sollten in der Lage sein zu tun:Dadurch wird sichergestellt, dass die Elemente korrekt geparst.
Ich denke auch, dass Sie können entfernen Sie die
ini_set
wie das für native Funktionen, wiefile_get_contents
undfopen
streams etc, so überprüfen Sie die Zeile:Ich würde auch überprüfen, um zu sehen, ob es ein cookie bereits von der Hauptseite aus, wie index.php die Website blockieren kann Anfragen von Quellen, die direkt auf die login-Seite mit den Daten.
Ähnliches Ergebnis mit $_POST, anstatt dass man es manuell. Ich sollte wohl Codierung jeder Wert, wenn ich werde manuell splitten, aber ich versuche nur, um es an die Arbeit an diesem Punkt.
Auch ich würde überprüfen, um zu sehen, ob es ein cookie bereits von der Hauptseite aus, wie index.php die Website blockieren kann Anfragen von Quellen, die direkt auf die login-Seite mit den Daten.
Scheint nicht zu sein, basierend auf dem, was ich sehe in der cookie-Datei. Es muss nur eine session-ID, die einzigartig ist in jedem cookie-Datei (jede Anfrage, tatsächlich.)
Seine ziemlich schwierig, ohne zu wissen, die Website versucht, eine Verbindung herzustellen, da hätte ich gerne ein test-Skript selbst
InformationsquelleAutor RobertPitt