我正在为一个需要通过链接点击自动登录的客户开发一个项目。
我正在使用握手页面使用以下代码执行此操作:
$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应用程序位于“wordpress”目录中,该目录位于“blog”目录中。浏览器中的网址为..blog/handshake.php
。但是,它在浏览器窗口中有WordPress的Admin部分。 WordPress管理链接现在无法正常运行,因为当URL需要位于../blog
目录中时,该URL位于..blog/wordpress/wp-admin
目录中。
cURL是否有办法让浏览器中的网址反映实际网页?
我应该使用FSockOPen吗?
答案 0 :(得分:12)
Kalium得到了正确的结果 - WordPress界面中的路径是相对的,导致管理界面在以这种方式访问时无法正常工作。
您的方法在某些方面存在问题,因此我想提出一些快速建议。
首先,我会尝试找到一种方法来删除$username
和$password
变量的硬编码。想想破解是多么容易 - 例如,如果密码是通过管理界面更新的,那么代码中的硬编码值将不再正确,您的“自动登录”现在将失败。此外,如果有人以某种方式组成该网站并获得对handshake.php
的访问权限 - 那么,现在他们已经获得了您博客的用户名和密码。
看起来您的WordPress安装与您编写的握手脚本位于同一服务器上,因为/blog
的路径是相对的(在您的示例代码中)。因此,我建议尝试模仿他们在父应用程序登录中验证的会话。我过去曾多次这样做 - 只是不记得具体细节。因此,例如,您的登录脚本不仅会设置您的登录凭据,还会设置WordPress身份验证所需的会话密钥。
这个过程将涉及挖掘很多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对用户进行身份验证,然后尝试将管理界面劫持到当前页面,而不是将其重定向到常规管理界面。
我希望这有帮助!如果您需要更多帮助,请告诉我/解决方案尚不清楚。
答案 1 :(得分:1)
检查HTML源代码。听起来WP的链接可能是相对的。但是,我建议您执行登录,向用户提供所需的任何cookie,并重定向它们,而不是使此过程比现在更复杂。
否则你就是一块一块地编写代理。
答案 2 :(得分:1)
如果您的脚本没有执行单次执行所需的所有功能,您可能需要解析cookie值,将它们存储在文件中,然后在下次执行时重新发送。查看CURLOPT_COOKIEFILE选项。
答案 3 :(得分:0)
使用Zend Framework's Cookies课程为您管理它们。我过去曾使用此功能使用cURL抓取网站的安全部分。
答案 4 :(得分:0)
以下是对我有用的代码:
关键的变化是我从帖子字符串中删除了名为“ 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)