1

从最近开始,cPanel 改变了它的登录方式。

登录前,网址为:https://accessurl:2083/

登录后:https://accessurl:2083/cpsessXXXX/frontend/x3/index.html?post_login=89711792346495

您会注意到嵌入在 url 中的cpsessXXXX 。

访问 AWSTATS 的页面是:https://accessurl:2083/cpsessXXXX/awstats.pl?config=domain_name&ssl=&lang=en

我尝试了以下 PHP 代码

$username = 'xxx';
$password = 'xxx';
$loginUrl = 'https://<accessurl>';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'user='.$username.'&pass='.$password);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PORT,2083);
$store = curl_exec($ch);
curl_close($ch);

当我单步执行代码时,$store的值为 FALSE,这意味着登录过程失败。

我在网上找到的类似问题的唯一参考是http://blog.mcfang.com/在 3 月 28 日的条目中。

我希望 cookies.txt 有 cpsessXXXX 信息,但没有创建文件。

谢谢你的帮助

4

2 回答 2

5

您需要将安全令牌引用回 cPanel,以便您的脚本被接受。根据安全令牌的 cPanel 文档中的文档

举个例子:

function createSession() { // Example details
$ip = "127.0.0.1";
$cp_user = "username";
$cp_pwd = "password";
$url = "http://$ip:2082/login";
$cookies = "/path/to/storage/for/cookies.txt";

// Create new curl handle
$ch=curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookies); // Save cookies to
curl_setopt($ch, CURLOPT_POSTFIELDS, "user=$cp_user&pass=$cp_pwd");
curl_setopt($ch, CURLOPT_TIMEOUT, 100020);

// Execute the curl handle and fetch info then close streams.
$f = curl_exec($ch);
$h = curl_getinfo($ch);
curl_close($ch);

// If we had no issues then try to fetch the cpsess
if ($f == true and strpos($h['url'],"cpsess"))
{
    // Get the cpsess part of the url
    $pattern="/.*?(\/cpsess.*?)\/.*?/is";
    $preg_res=preg_match($pattern,$h['url'],$cpsess);
}

// If we have a session then return it otherwise return empty string
return (isset($cpsess[1])) ? $cpsess[1] : "";
} 

cpsess 用于将 URL 附加到 cPanel 期望返回的正确令牌。

于 2012-12-03T21:54:10.740 回答
2

您可以通过添加以下简单行的标题发送“授权”行:

$header[0] = "Authorization: Basic " . base64_encode($cp_user.":".$cp_pwd) . "\n\r";
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);  

因此,您可以直接向资源 $myResource 发送请求,而无需使用 cookie 和其他任何东西。简单地:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $myResource);
$header[0] = "Authorization: Basic " . base64_encode($cp_user.":".$cp_pwd) . "\n\r";
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PORT,2083);
$store = curl_exec($ch);
curl_close($ch);

您应该考虑使用CPanel 的 XML API。在 Github 上你可以找到xmlapi-php 类,它工作得很好,帮助我保持代码简单和易于更新!

于 2013-10-11T11:35:51.713 回答