繁体   English   中英

PHP curl 使用密码和用户名以及隐藏令牌登录到 url

[英]PHP curl login to url with password and username and hidden token

我在使用 curl登录网站时遇到问题,该网站有一个带令牌的隐藏输入字段。 现在我认为这是可能的,但我找不到解决方案 有人知道我该如何解决吗?

$username = '2142019677';
$password = 'Vercautp1'; //no secrets here
        $link = 'https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c';
        $html = file_get_contents($link);
        preg_match_all("'VerificationToken\" type=\"hidden\" value=\"(.*?)\"'si", $html, $match);
        $hidden = $match[1][0];

        preg_match_all("'action=\"/(.*?)\" method=\"post\"'si", $html, $match);
        $url = $match[1][0];

$path = "/ctemp";
$postinfo = "Username=".$username."&Password=".$password.'__RequestVerificationToken='.$hidden;

$cookie_file_path = $path."/cookie.txt";

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, 'https://www.autoscout24.be'.$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, "https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c");
$html = curl_exec($ch);
echo $html;
curl_close($ch);

正在向服务器发送表单数据:

https://stackoverflow.com/a/53758840/4323201

所以你需要看起来类似于这样的代码:

$ch = curl_init ( 'https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c' );
curl_setopt_array ( $ch, array (
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => array (
           '__RequestVerificationToken` => 'Ikt8rjIySPHhjsx48MYwrHBDOjhEBdKDkGR6PIzkPHs9oDBfzO8M1O2ZEAlXt3ARCgJq-8UvjhUEMbAxZMffCOQTQ7AfTmxWK785T5TL18k1'
           'Username' => '2142019677',
           'Password' => 'Vercautp1',
           'RememberMeCheckBox' => 'on',
           'RememberMe' => true
        ) 
) );
curl_exec ( $ch );

棘手的部分是生成__RequestVerificationToken ,它可能是用户名和密码的 hash,但如果不分析创建它的 JS,就不知道它是如何生成的。

另请参阅: https://stackoverflow.com/a/46872809/4323201

这里有很多问题,从哪里开始..

首先,这行不通:

$link = 'https://www.autoscout24.be/dealer-statistics/api/listing/overview/d42ea89e-b717-4ab4-85ee-2b5e7bff959c';
$html = file_get_contents($link);
preg_match_all("'VerificationToken\" type=\"hidden\" value=\"(.*?)\"'si", $html, $match);
  • 您要在此处提取的 verificationToken 与 file_get_contents() 收到的 cookie session 相关联,并且 file_get_contents 不与 curl 共享 cookies(实际上 file_get_contents 根本没有 cookie 支持,实际上,但不是字面意思,详细说明会go 在这里偏离轨道..)

所以你必须用curl来获取它,而curl在获取它时必须启用cookies。 您的正则表达式提取也应替换为 DOMDocument+DOMXPath 提取,但由于您不这样做,因此您必须运行通过 html_entity_decode() 提取的代码,例如,如果您的正则表达式提取a&b那么令牌不是a&b ,它是a&b html 编码的(所以你需要对其进行 html 解码)

还有你的$postinfo = "Username=".$username."&Password=".$password.'__RequestVerificationToken='.$hidden; 仅当您的用户名/密码中没有特殊字符时才有效,例如,如果您的密码是Password&999 ,则必须将其作为Password%26999发送 - 因为 & 需要进行 urlencoded,所以您需要像

$postinfo = "Username=".urlencode($username)."&Password=".urlencode($password).'&__RequestVerificationToken='.urlencode($hidden);

或者更好

$postinfo = http_build_query(array(
    "Username" => $username,
    "Password" => $password,
    '__RequestVerificationToken' => $hidden
));

也不要将 CURLOPT_CUSTOMREQUEST 用于 POST,引用 libcurl 文档https://curl.se/libcurl/c/CURLOPT_CUSTOMREQUEST.html

许多人错误地使用此选项将整个请求替换为自己的请求,包括多个标头和 POST 内容。 虽然这在许多情况下可能有效,但它会导致 libcurl 发送无效请求,并且可能会严重混淆远程服务器。 使用 CURLOPT_POST 和 CURLOPT_POSTFIELDS 设置 POST 数据。

...最后一件,我看到你忘了在__RequestVerificationToken前面放一个 & - http_build_query 也会为你做这件事

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM