18 Stimmen

PHP, cURL post zur Anmeldung bei WordPress

Ich arbeite an einem Projekt für einen Kunden, der ein automatisches Login nach einem Link-Klick benötigt.

Ich verwende dazu eine Handshake-Seite mit dem folgenden Code:

$username = "admin";
$password = "blog";
$url = "http://wordpressblogURL/";
$cookie = "cookie.txt";

$postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to=" . $url . "blog/wordpress/wp-admin/&testcookie=1";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url . "blog/wordpress/wp-login.php");

curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 0);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_REFERER, $url . "blog/wordpress/wp-login.php");

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
curl_close($ch);
echo $result;

exit;

Das funktioniert gut. Es meldet mich großartig an.

Das Problem ist, dass ich glaube, dass WordPress die URL als Schlüssel verwendet.

Zur Erläuterung: Meine Handshake-Seite (mit der ich mich anmelde) befindet sich im Verzeichnis "blog" und meine WordPress-Anwendung im Verzeichnis "wordpress", das sich innerhalb des Verzeichnisses "blog" befindet. Die URL im Browser lautet ..blog/handshake.php . Es hat jedoch den Admin-Bereich von WordPress im Browserfenster. WordPress-Admin-Links funktionieren jetzt nicht mehr richtig, weil die URL im ../blog Verzeichnis, wenn es im Verzeichnis ..blog/wordpress/wp-admin Verzeichnis.

Gibt es eine Möglichkeit, in cURL damit die URL im Browser der tatsächlichen Seite entspricht?

Sollte ich stattdessen FSockOPen verwenden?

14voto

Skone Punkte 745

Kalium hat das richtig verstanden - Pfade in der WordPress-Oberfläche sind relativ, was dazu führt, dass die Verwaltungsoberfläche nicht richtig funktioniert, wenn auf diese Weise darauf zugegriffen wird.

Ihr Ansatz ist in mehrfacher Hinsicht bedenklich, daher möchte ich Ihnen einige kurze Empfehlungen geben.

Erstens würde ich versuchen, eine Möglichkeit zu finden, die $username et $password Variablen nicht hart kodiert werden. Denken Sie daran, wie leicht dies zu umgehen ist - wenn das Passwort beispielsweise über die Administrationsschnittstelle aktualisiert wird, ist der fest kodierte Wert in Ihrem Code nicht mehr korrekt, und Ihr "Auto-Login" schlägt nun fehl. Außerdem, wenn jemand die Seite irgendwie umfasst und Zugang zu handshake.php -- Nun, jetzt haben sie den Benutzernamen und das Passwort für Ihren Blog.

Es sieht so aus, als ob Ihre WordPress-Installation auf demselben Server liegt wie das Handshake-Skript, das Sie geschrieben haben, da der Pfad zu /blog relativ ist (in Ihrem Beispielcode). Dementsprechend würde ich vorschlagen, zu versuchen, die Sitzung zu imitieren, gegen die sie in Ihrer übergeordneten Anwendungen Login validieren. Ich habe das in der Vergangenheit schon mehrmals gemacht - ich kann mich nur nicht mehr an die Einzelheiten erinnern. So, zum Beispiel, Ihr Login-Skript würde nicht nur Ihre Anmeldeinformationen festgelegt, sondern auch die Session-Schlüssel für WordPress-Authentifizierung erforderlich.

Bei diesem Prozess wird man sich durch eine Menge WordPress-Code wühlen müssen, aber das ist das Schöne an Open Source! Anstatt cURL zu verwenden und Werte hart zu kodieren, sollten Sie versuchen, den WordPress-Authentifizierungsmechanismus einfach in den Anmeldemechanismus Ihrer Anwendung zu integrieren. Ich würde damit beginnen, mir den Quellcode für wp-login.php und von dort aus weiter.

Wenn alles andere fehlschlägt und Sie nicht versuchen wollen, Ihren Sitzungsauthentifizierungsmechanismus mit dem von WordPress zu verknüpfen, können Sie Ihr Problem mit diesen Änderungen an Ihrem Code sofort beheben (ohne die problematischeren Aspekte Ihres Ansatzes zu beheben):

Fügen Sie zunächst das folgende curl_opt:

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);  // Enables session support

Dann fügen Sie dies nach dem Schließen des cURL-Handlers hinzu:

curl_close($ch);
// Instead of echoing the result, redirect to the administration interface, now that the valid, authenticated session has been established
header('location: blog/wordpress/wp-admin/');
die();

In dieser nicht ganz idealen Lösung würden Sie also cURL verwenden, um den Benutzer zu authentifizieren, und dann, anstatt zu versuchen, die Verwaltungsschnittstelle in die aktuelle Seite zu hijacken, den Benutzer auf die reguläre Verwaltungsschnittstelle umleiten.

Ich hoffe, das hilft! Lassen Sie es mich wissen, wenn Sie mehr Hilfe brauchen / die Lösung nicht klar ist.

2voto

Berty Punkte 48

Hier ist der Code, der bei mir funktioniert hat:

Die wichtigste Änderung ist, dass ich den Parameter "testcookie" aus meinem Post-String entfernt habe.

Hinweis: Fügen Sie Ihre Website anstelle von "mywordpress" sowie Ihren Benutzernamen und Ihr Passwort in den folgenden Code ein

$curl = curl_init();

//---------------- generic cURL settings start ----------------
$header     = array(
      "Referer: https://mywordpress/wp-login.php",
"Origin: https://mywordpress",
"Content-Type: application/x-www-form-urlencoded",
"Cache-Control: no-cache",
"Pragma: no-cache",
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15"
      );

curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15');
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookies.txt');
//---------------- generic cURL settings end ----------------

$url = 'https://mywordpress/wp-login.php';
curl_setopt($curl, CURLOPT_URL, $url);

$post = 'log=username&pwd=password&wp-submit=Log+In&redirect_to=https%3A%2F% mywordpress%2Fwp-admin%2F';
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);

$output = curl_exec($curl);

curl_close ($curl);

echo ($output)

1voto

Kalium Punkte 4574

Prüfen Sie den HTML-Quelltext. Es klingt, als ob die Links von WP relativ sein könnten. Anstatt diesen Prozess noch komplizierter zu machen, als er ohnehin schon ist, schlage ich vor, dass Sie die Anmeldung durchführen, dem Benutzer die erforderlichen Cookies übergeben und ihn dann weiterleiten.

Andernfalls programmieren Sie Stück für Stück einen Proxy.

0 Stimmen

Guter Gedanke, aber das setzt voraus, dass sich das Anmeldeskript und die Wordpress-Installation auf derselben Domäne befinden - andernfalls gibt es keine Möglichkeit, das Cookie zu setzen.

0 Stimmen

Wenn Sie über ausreichenden Zugang verfügen, können Sie eine Subdomain der WordPress-Domain einrichten und diese zum Setzen von Cookies nach Bedarf verwenden. Das ist zwar eine Art Hack, aber immer noch besser, als stückweise einen Proxy zu erstellen.

1voto

Chris Henry Punkte 11720

Wenn Ihr Skript nicht alle Funktionen, die Sie benötigen, in einer einzigen Ausführung durchführt, müssen Sie die Cookie-Werte möglicherweise auslesen, in einer Datei speichern und bei der nächsten Ausführung erneut senden. Sehen Sie sich die Option CURLOPT_COOKIEFILE an.

0voto

Jake N Punkte 10308

Verwenden Sie Cookies von Zend Framework Klasse, um sie für Sie zu verwalten. Ich habe dies in der Vergangenheit für das Crawlen sicherer Abschnitte einer Website verwendet, indem ich cURL .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X