Login mit PHP-curl-und CSRF-token
Ich möchte die Anmeldung von einem PHP-Skript auf einer anderen website, aber ich bekomme immer diese Antwort:
403 Error: CSRF token mismatch
Extrahiere ich den CSRF-token von einem versteckten Bereich auf der website, aber es scheint, dass es falsch ist. Das ist mein code:
$username = "testuser";
$password = "testpass";
$path = "c:\\test\\";
$url="http://itw.me/login";
$field='_csrf';
$html=file_get_contents( $url );
libxml_use_internal_errors( true );
$dom=new DOMDocument;
$dom->validateOnParse=false;
$dom->recover=true;
$dom->formatOutput=false;
$dom->loadHTML( $html );
libxml_clear_errors();
$xpath=new DOMXPath( $dom );
$col=$xpath->query('//input[@name="'.$field.'"]');
foreach( $col as $node ) $csrftoken=$node->getAttribute('value');
echo "-".$csrftoken."-";
$postinfo = "email=".$username."&password=".$password."&_csrf=".$csrftoken;
$cookie_file_path = $path."/cookie.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
curl_setopt($ch, CURLOPT_USERAGENT,"Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, "http://itw.me");
$html = curl_exec($ch);
print($html);
curl_close($ch);
- Erhalten Sie alles, was in der Zeile mit echo "-".$csrftoken."-";
- ja ich bekomme eine crsf-token, aber das scheint nur gültig für den ersten laden von Seiten wo ich schnappe mir dieses token.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machen Sie Ihre erste Anfrage mit
file_get_contents
und der zweite request mit cURL.Sie haben eine Keksdose für die zweite Anforderung, aber nicht für die erste Anforderung. Folglich, jedes dieser beiden Anforderungen ist eine neue Sitzung starten.
CSRF-Token in der session gespeichert, indem Sie den server, der die Anfrage auf, so wird das token erhalten Sie bei der ersten Anfrage übereinstimmen, wird nicht das token in der session für die zweite Anforderung.
Müssen Sie:
nun, es funktioniert!
CSRF-token genrated für jede Sitzung.
Lesen Sie den ersten Kommentar ot-yor-Frage (@walkingRed Kommentar) (Kommentar gelöscht - cURL CSRF-Token - das ist die Lösung). Gibt es Lösung für Ihr problem.
Sollten Sie beginnen, Ihre Sitzung auf der anderen website und danach können Sie die richtige csrf-token.
Und es ist wichtig, die Verwendung von cookies bei jeder Anfrage zu definieren, dass Ihre externe Anforderung stets in der gleichen Sitzung.
Beispiel:
Machen Sie erste Anforderung zu greifen CSRF-token. Auf der externen website gestartet neue Sitzung für Ihre Anfrage und generiert csrf-token.
Dann machen Sie anohter Anfrage - aber ohne Verwendung von cookies - für diese reuqest begann die neue session wieder und wieder erzeugt neue csrf-token für diese neue session.