Как войти в girisv3.itu.edu.tr с помощью php / curl? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь зайти на этот сайт över mu сайт (то есть localhost) https://girisv3.itu.edu.tr/Login.aspx

В соответствии с примером кода, приведенным здесь для входа в Facebook на другом сайте (localhost) PHP cURL для входа вfacebook

Я пытаюсь применить этот логин Facebook для входа в itu.edu.tr.Но это не сработало.Я также новичок в curl и php.Как я могу сделать это для этого сайта (itu.edu.tr)?

<?php
    $username = 'username@itu.edu.tr';
    $password = 'password';
    $loginUrl = 'https://girisv3.itu.edu.tr/Login.aspx';

    $ch = curl_init();


    curl_setopt($ch, CURLOPT_URL, $loginUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, 'ContentPlaceHolder1_tbUserName='.$username.'&ContentPlaceHolder1_tbPassword='.$password.'&ContentPlaceHolder1_btnLogin=Login');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, "http://www.itu.edu.tr");
    //execute the request
    $content = curl_exec($ch);

    echo $content;
?>

1 Ответ

0 голосов
/ 18 февраля 2019

система входа в систему girisv3.itu.edu.tr имеет мало общего с системой входа в Facebook (могу с уверенностью сказать, потому что я изучила систему входа в Facebook и написала код, который входит в Facebook )

, чтобы войти здесь, сначала нажмите https://girisv3.itu.edu.tr/Login.aspx простым HTTP GET-запросом, здесь вы будете перенаправлены 5 раз (почему? Чертова идея, хотя по крайней мере 2 из них должны проверитьчто у вас включены файлы cookie) с HTTP Location -reirects , при первом перенаправлении вы получите cookie, похожее на Set-Cookie: ASP.NET_SessionId=fzwd05uqv2ogyvj2p4ip2x3u; path=/; HttpOnly, сохраните его и повторно используйте во всех следующих перенаправлениях (если вы не, вы получите сообщение об ошибке типа The ITU Introduction application uses cookies. Your browser has been found to block cookies. Please allow cookies from the browser settings and try again later.), и при последнем запросе вы получите файл cookie, похожий на Cookie: ASP.NET_SessionId=nmhigw3julmzbedva0zwklj2; cookieCheck=true, это файл cookie, который вам необходим для входа в систему. (cookieCheck=true, вероятно, означает, что вы передали файл cookietest), как только вы закончите с перенаправлениями, HTML-код содержит много данных, которые необходимо проанализировать для входа в систему, элемент <form содержит уникальный URL-адрес, специфичный для вашего cookie-файла, где вам нужнозавершите запрос POST для входа в систему, это выглядит как

<form method="post" action="./Login.aspx?subSessionId=543cf6e7-d262-46f3-8207-740d92298bd3&amp;currentURL=https%3a%2f%2fportal.itu.edu.tr%2flogin.aspx%3fReturnUrl%3d%252fapps%252fdefault%252f&amp;cookieAdded=true" id="form1">

, и есть куча <input> элементов, содержащих данные, которые вам также необходимо проанализировать и добавить к фактическому запросу входа, в частности

__VIEWSTATE и __VIEWSTATEGENERATOR и __EVENTVALIDATION и ctl00$ContentPlaceHolder1$hfAppName и ctl00$ContentPlaceHolder1$hfToken и ctl00$ContentPlaceHolder1$hfVerifier и ctl00$ContentPlaceHolder1$hfCode и ctl00$ContentPlaceHolder1$hfState и (кстати, это 1 логин) ctl00$ContentPlaceHolder1$tbUserNameи (это 1 - пароль для входа) ctl00$ContentPlaceHolder1$tbPassword и ctl00$ContentPlaceHolder1$btnLogin

после того, как данные POST для входа в систему проанализированы в html, добавьте имя пользователя для входа в систему ctl00$ContentPlaceHolder1$tbUserName и добавьте пароль для входа в систему ctl00$ContentPlaceHolder1$tbPassword, и отправьте фактический запрос входа в систему по URL-адресу, полученному из элемента <form вместе с файлом cookie, полученным в последнем http-перенаправлении, данные должны быть закодированы в формате application/x-www-form-urlencoded (и PHP имеет встроенную функциюдля кодирования массивов php в формате application/x-www-form-urlencoded, называемом http_build_query)

, вот пример с hhb_curl (оболочка php curl_ api, которая заботится об обнаружении ошибок (превращение ошибок тихого скручивания)в RuntimeExceptions), куки,следующее Location перенаправляет, освобождая ресурсы curl, а затем некоторые)

<?php
declare (strict_types = 1);
const USERNAME = "TheUsername";
const PASSWORD = "ThePassword";
require_once('hhb_.inc.php');
$hc = new hhb_curl('', true);
$html = $hc->exec('https://girisv3.itu.edu.tr/Login.aspx')->getStdOut();
$domd = @DOMDocument::loadHTML($html);
$xp = new DOMXPath($domd);
$loginForm = $domd->getElementById("form1");
$login_url = 'https://girisv3.itu.edu.tr/' . $loginForm->getAttribute("action");
$postDataInputNames = array(
    '__VIEWSTATE',
    '__VIEWSTATEGENERATOR',
    '__EVENTVALIDATION',
    'ctl00$ContentPlaceHolder1$hfAppName',
    'ctl00$ContentPlaceHolder1$hfToken',
    'ctl00$ContentPlaceHolder1$hfVerifier',
    'ctl00$ContentPlaceHolder1$hfCode',
    'ctl00$ContentPlaceHolder1$hfState',
    'ctl00$ContentPlaceHolder1$tbUserName',
    'ctl00$ContentPlaceHolder1$tbPassword',
    'ctl00$ContentPlaceHolder1$btnLogin',
);
$postData = [];
foreach ($postDataInputNames as $name) {
    $ele = $xp->query('.//input[@name=' . xpath_quote($name) . ']', $loginForm);
    if (!$ele->length) {
        var_dump($html);
        throw new \LogicException("failed to find input form {$name}!");
    }
    $ele = $ele->item(0);
    $postData[$name] = $ele->getAttribute("value");
}
$postData['ctl00$ContentPlaceHolder1$tbUserName'] = USERNAME;
$postData['ctl00$ContentPlaceHolder1$tbPassword'] = PASSWORD;
var_dump('login post data: ', $postData);
$html = $hc->setopt_array(array(
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => http_build_query($postData),
    CURLOPT_URL => $login_url,
))->exec()->getStdOut();
$domd = @DOMDocument::loadHTML('<?xml encoding="UTF-8">' . $html);
$xp = new DOMXPath($domd);
$loginError = $domd->getElementById("ContentPlaceHolder1_lbHata");
if ($loginError && !empty(trim($loginError->textContent))) {
    echo "LOGIN ERROR: " . trim($loginError->textContent) . "\n";
} else {
    echo "Login success! ";
    var_dump($html);
}


//based on https://stackoverflow.com/a/1352556/1067003
function xpath_quote(string $value) : string
{
    if (false === strpos($value, '"')) {
        return '"' . $value . '"';
    }
    if (false === strpos($value, '\'')) {
        return '\'' . $value . '\'';
    }
    // if the value contains both single and double quotes, construct an
    // expression that concatenates all non-double-quote substrings with
    // the quotes, e.g.:
    //
    //    concat("'foo'", '"', "bar")
    $sb = 'concat(';
    $substrings = explode('"', $value);
    for ($i = 0; $i < count($substrings); ++$i) {
        $needComma = ($i > 0);
        if ($substrings[$i] !== '') {
            if ($i > 0) {
                $sb .= ', ';
            }
            $sb .= '"' . $substrings[$i] . '"';
            $needComma = true;
        }
        if ($i < (count($substrings) - 1)) {
            if ($needComma) {
                $sb .= ', ';
            }
            $sb .= "'\"'";
        }
    }
    $sb .= ')';
    return $sb;
}

, что приводит к:

LOGIN ERROR: Kullanıcı adı veya şifre hatalı.

, что означает, что имя пользователя / пароль недействительны, потому что, по-видимому, TheUsername и ThePassword не действительны учетные данные для входа.

всю информацию, необходимую для входа в систему, можно получить, установив Fiddler Proxy и войдя в систему с помощью браузера (например, FireFox), а затем скопировав процедуру входа в браузер с помощью php / curl, что я и сделалздесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...