PHP,cURL post登录到WordPress

PHP,cURL post登录到WordPress,php,wordpress,curl,Php,Wordpress,Curl,我正在为一个客户的项目,需要从一个链接点击自动登录工作 我正在使用握手页面使用以下代码执行此操作: $username = "admin"; $password = "blog"; $url = "http://wordpressblogURL/"; $cookie = "cookie.txt"; $postdata = "log=" . $username . "&pwd=" . $password . "&wp-submit=Log%20In&redirect_to

我正在为一个客户的项目,需要从一个链接点击自动登录工作

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

$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上取下的

更详细地说,我的握手页面(让我登录)位于“blog”目录中,我的WordPress应用程序位于“blog”目录中的“WordPress”目录中。浏览器中的URL显示
.blog/handshake.php
。但是,它在浏览器窗口中有WordPress的管理部分。WordPress管理员链接现在无法正常工作,因为URL需要位于
.blog/WordPress/wp Admin
目录中时,它位于
.blog/WordPress/wp Admin
目录中

是否有办法使浏览器中的URL反映实际页面


我应该改用FSockOPen吗?

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


否则,您将逐个编写代理。

如果您的脚本在一次执行中没有执行所需的所有功能,您可能需要解析cookie值,将其存储在文件中,然后在下一次执行时重新发送。查看CURLOPT_COOKIEFILE选项。

Kalium正确地选择了这个选项——WordPress界面中的路径是相对的,以这种方式访问时,会导致管理界面无法正常工作

你的方法涉及到几个方面,所以我想提出一些快速的建议

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

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

这个过程需要挖掘大量WordPress的代码,但这就是开源的美妙之处!不要使用cURL和硬编码值,试着简单地将WordPress的身份验证机制集成到应用程序的登录机制中。首先,我要查看
wp login.php
的源代码,然后从那里开始

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

首先,添加以下选项:

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对用户进行身份验证,然后将他们重定向到常规的管理界面,而不是试图将管理界面劫持到当前页面


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

使用类为您管理它们。过去,我曾使用此功能在网站的安全部分进行爬行。

以下是适用于我的代码:

关键的变化是我从我的post字符串中删除了名为“testcookie”的参数

注意:在下面的代码中添加您的网站而不是“mywordpress”以及用户名和密码

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

好主意,但前提是登录脚本和wordpress安装在同一个域上,否则无法设置cookie。如果您有足够的访问权限,请设置wordpress域的子域,并根据需要使用该子域设置cookie。这有点像黑客,但还是比零碎地创建代理要好。