PHP,cURL帖子登录WordPress

2022-08-30 22:22:45

我正在为一个需要通过链接单击自动登录的客户进行项目。

我正在使用握手页面通过以下代码执行此操作:

$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;

这工作正常。它让我登录很棒。

问题是我相信WordPress键离开了URL。

详细说明一下,我的握手页面(使我登录)位于“博客”目录中,而我的WordPress应用程序位于“博客”目录中的“wordpress”目录中。浏览器中的 URL 显示 。但是,它在浏览器窗口中具有WordPress的“管理”部分。WordPress Admin链接现在无法正常运行,因为当URL需要位于目录中时,它位于目录中。..blog/handshake.php../blog..blog/wordpress/wp-admin

有没有办法在cURL中使浏览器中的URL反映实际页面?

我应该使用FSockOPen吗?


答案 1

Kalium做对了 - WordPress界面中的路径是相对的,导致以这种方式访问管理界面时无法正常工作。

您的方法在几个方面令人担忧,因此我想提出一些快速建议。

首先,我会尝试找到一种方法来删除和变量,使其免于硬编码。想想这是多么容易被打破 - 例如,如果通过管理界面更新密码,则代码中的硬编码值将不再正确,并且您的“自动登录”现在将失败。此外,如果有人以某种方式组成了该网站并获得了访问权限 - 好吧,现在他们已经获得了您博客的用户名和密码。$username$passwordhandshake.php

看起来您的WordPress安装与您编写的握手脚本位于同一服务器上,给定路径是相对的(在您的示例代码中)。因此,我建议尝试模仿它们在父应用程序登录中验证的会话。我过去做过几次这样的事 -- 只是想不起具体细节。因此,例如,您的登录脚本不仅可以设置您的登录凭据,还可以设置WordPress身份验证所需的会话密钥。/blog

这个过程将涉及挖掘很多WordPress的代码,但这就是开源的美妙之处!不要使用cURL和硬编码值,而是尝试简单地将WordPress的身份验证机制集成到应用程序的登录机制中。我会从寻找源头开始,然后从那里开始。wp-login.php

如果所有其他方法都失败了,并且您决定不尝试将会话身份验证机制与WordPress的会话身份验证机制网格化,那么您可以通过对代码进行以下更改来立即解决问题(而无需修复方法中更相关的方面):

首先,添加以下curl_opt:

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

然后,在关闭 cURL 处理程序后添加以下内容:

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();

因此,在这个不太理想的解决方案中,您将使用 cURL 对用户进行身份验证,然后不要尝试将管理界面劫持到当前页面,而是将其重定向到常规管理界面。

我希望这有帮助!如果您需要更多帮助/解决方案不清楚,请告诉我。


答案 2

检查 HTML 源代码。听起来WP的链接可能是相对的。但是,与其使此过程比现在更复杂,我建议您执行登录,将所需的cookie交给用户,然后重定向它们。

否则,您正在对代理进行编码,一点一点。


推荐