Как войти на сайт с помощью библиотеки PHP Curl? - PullRequest
0 голосов
/ 02 июня 2019

Я хочу войти на страницу в https, используя библиотеку PHP CURL. Перезагрузить страницу. Но я не мог. Я не мог установить соединение с сервера или локального хоста.

 $username = "pik123@gmail.com";
$password = "Bf*****";
$url = "https://eksisozluk.com/giris";
$cookie= "cookies.txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) die(curl_error($ch));
$dom = new DomDocument();
$dom->loadHTML($response);
$tokens = $dom->getElementsByTagName("meta");
for ($i = 0; $i < $tokens->length; $i++)
{
    $meta = $tokens->item($i);
    if($meta->getAttribute('name') == 'csrf-token')
    $token = $meta->getAttribute('content');
}
$postinfo = "UserName=".$username."&Password=".$password."&_csrf=".$token;
echo $token; //debug info
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
$html = curl_exec($ch);
    print($html);
if (curl_errno($ch)) print curl_error($ch);
    curl_close($ch);

Я печатаю печенье. Просто даю тебе чистый лист. Я получаю сообщение об ошибке.

1 Ответ

0 голосов
/ 02 июня 2019

вы пытаетесь отправить учетные данные для входа до получения куки-файла, но веб-сайт требует, чтобы у вас уже был куки-файл ПРИОР для входа в систему. Кроме того, веб-сайт использует CSRF-токен , который необходимо получить довойти в систему, но вы не делаете.Кроме того, ваше имя пользователя и пароль должны быть urlencoded, но вы не urlencode это, например, @ неправильный, он должен был быть Username=pik123%40gmail.com (@ urlencoded is %40), также вызывается переменная usernameUserName, а не Username,

сначала извлеките страницу входа с помощью обычного запроса GET, и вы получите как нужный файл cookie, так и токен CSRF,

, а затем выполните анализтокен CSRF и отправьте запрос POST на страницу входа с cookie и токен CSRF в формате application/x-www-form-urlencoded, с __RequestVerificationToken в качестве токена CSRF и UserName в качестве имени пользователя (и будьте более осторожны с CaPiTaLiZaTiOnздесь это UserName, а не Username), и Password в качестве пароля, и, казалось бы, жестко закодированный параметр, называемый ReturnUrl, который просто содержит / (urlencoded ofc, который равен %2F, например, ReturnUrl=%2F), и вы должны войти в систему (сеанс cookie теперь будет входить в систему), при условии, что у вас есть действительные учетные данные. Пример

с библиотекой hhb_curl (которая заботится об обработке файлов cookie идворняжкаl проверка ошибок, преобразование ошибок скручивания в RuntimeExceptions):

<?php
declare (strict_types = 1);
require_once('hhb_.inc.php');
$username = "pik123@gmail.com";
$password = "Bf*****";
$hc = new hhb_curl('', true);
// get cookie and csrc token:
$html = $hc->exec('https://eksisozluk.com/giris')->getStdOut();
$domd = @DOMDocument::loadHTML($html);
$xp = new DOMXPath($domd);
// grab the login form (it contains the csrf token, among other things)
$login_form = $xp->query("//form[contains(@action,'/giris')]")->item(0);
$login_parameters = array();
foreach ($login_form->getElementsByTagName("input") as $input) {
    $login_parameters[$input->getAttribute("name")] = $input->getAttribute("value");
}
// the CSRF token is called `__RequestVerificationToken`, and $login_parameters now contains roughly:
// array(
//  '__RequestVerificationToken' => 'qTk2Ik0glfV8W1WckmrVkVXujQE8C1eTqMEe36SP-PPUXDn88GG0XYxif3ZMIVGZH08-MEbbtD7i7Q4ymxuasveDZL-WaHQH22r33fOdsqQ1',
//  'ReturnUrl' => '/',
//  'UserName' => '',
//  'Password' => '',
//  'RememberMe' => 'false',
// );
assert(isset($login_parameters['UserName']));
assert(isset($login_parameters['Password']));
$login_parameters['UserName'] = $username;
$login_parameters['Password'] = $password;
// log in
$html = $hc->setopt_array(array(
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => http_build_query($login_parameters)
))->exec()->getStdOut();
// check for login errors:
$domd = @DOMDocument::loadHTML($html);
$xp = new DOMXPath($domd);
$login_errors = array();
foreach ($xp->query("//*[contains(@class,'validation-error')]") as $login_error) {
    $login_error = trim($login_error->textContent);
    if (!empty($login_error)) {
        $login_errors[] = $login_error;
    }
}
unset($login_error);
if (!empty($login_errors)) {
    throw new \RuntimeException("eksisozluk login errors: " . print_r($login_errors, true));
}

вывод:

$ php wtf4.php
PHP Fatal error:  Uncaught RuntimeException: eksisozluk login errors: Array
(
    [0] => captcha'yı yanlış girdiniz.
)
 in /cygdrive/c/projects/misc/wtf4.php:46
Stack trace:
#0 {main}
  thrown in /cygdrive/c/projects/misc/wtf4.php on line 46
  • , поскольку pik123@gmail.com / Bf***** не является действительными учетными данными для входа в систему.
...