Хобрук: Ваш путь к мастерству в программировании

curl логин, cookie сеанса в два прохода

Я пытаюсь войти с помощью curl на защищенный SSL-сайт, но почему-то у меня это не получается.

Первое соединение curl извлекает форму входа. Проблема с SSL в начале решена. Поля, используемые для аутентификации, и все скрытые поля идентифицируются и используются для следующего POST. Файл cookie определен, а также банку для чтения. Файл cookie доступен и обновляется при каждой попытке входа в систему. Сеансовый файл cookie успешно установлен curl. HTTPHEADER удален, чтобы запрос не попал в стену 100 Continue. Curl настроен на отслеживание и отправку реферера. Однако я до сих пор не могу найти, где скрипт зависает. Ни Curl, ни PHP не выдают никаких сообщений об ошибках или предупреждений.

Вот сокращенный скрипт:

$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE,       1);
curl_setopt($ch, CURLOPT_HEADER,        1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_AUTOREFERER,   1);
curl_setopt($ch, CURLOPT_HTTPHEADER,    array('Expect:')); // remove Expect header to avoid 100 Continue situations
curl_setopt($ch, CURLOPT_USERAGENT,     'Mozilla [abbreviated]');
curl_setopt($ch, CURLOPT_CAINFO,        dirname(__FILE__).'/cacert.pem');
curl_setopt($ch, CURLOPT_COOKIEFILE,    dirname(__FILE__).'/cookie.hq.txt'); // write cookies
curl_setopt($ch, CURLOPT_COOKIEJAR,     dirname(__FILE__).'/cookie.hq.txt'); // read cookies
curl_setopt($ch, CURLOPT_COOKIESESSION, 1);
curl_setopt($ch, CURLOPT_URL,           'https://the_url.jsp');

$data = curl_exec($ch);
$error= curl_error($ch);
if(!empty($error))
    echo '<p>'.$error.'</p>';
else
    echo '<p>ok</p>';

Теперь скрипт читает форму, заполняет учетные данные и отправляет их обратно, используя тот же дескриптор curl_init:

curl_setopt($ch, CURLOPT_POST,       1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $options);
$data = curl_exec($ch);
$error=curl_error($ch);

Но все, что я получаю, это снова та же форма и тот же файл cookie сеанса или новый, в зависимости от настройки CURLOPT_COOKIESESSION.

Когда я вхожу в систему вручную, я замечаю, что установлены еще два файла cookie: LtpaToken и LtpaToken2, но я никогда не вижу их в заголовках запросов, распечатываемых сценарием. Отправка формы вручную работает даже без активированного Javascript. Таким образом, не может быть какой-то магии JS, изменяющей данные формы под капотом перед ее отправкой. Очевидно, я что-то здесь упускаю. Любые идеи, где я могу смотреть дальше?

Решено: наконец, проблема возникла из-за проблемы с кодировкой в ​​POST. Первоначально данные POST были созданы из массива с помощью http_build_query(). Теперь данные POST просто объединяются, а ключи и значения кодируются отдельно:

    $options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value'));
08.08.2012

  • Чтобы убедиться, что JS не модифицируется, вы должны проверить запрос POST в браузере, используя такие инструменты, как Firebug, встроенные консоли разработчика. 08.08.2012
  • Я отклонил запрос на страницу, которая отображает полный массив $_REQUEST, и нет ничего, что выглядело бы иначе, чем исходная форма. 08.08.2012

Ответы:


1

Решено: наконец, проблема возникла из-за проблемы с кодировкой в ​​POST. Первоначально данные POST были созданы из массива с помощью http_build_query(). Теперь данные POST просто объединяются, а ключи и значения кодируются отдельно:

$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value'));
11.08.2012

2

См. ниже URL: --

сеанс входа cURL

и попробуйте это: -

http://php.net/manual/en/function.curl-setopt.php

<?php

 echo curl_grab_page("https://www.example.net/login.php", "https://www.example.net/", "username=foo&password=bar", "true",  "null", "false");

// $url = page to POST data
// $ref_url = tell the server which page you came from (spoofing)
// $login = true will make a clean cookie-file.
// $proxy = proxy data
// $proxystatus = do you use a proxy ? true/false

function
curl_grab_page($url,$ref_url,$data,$login,$proxy,$proxystatus){
    if($login == 'true') {
        $fp = fopen("cookie.txt", "w");
        fclose($fp);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
    curl_setopt($ch, CURLOPT_TIMEOUT, 40);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    if ($proxystatus == 'true') {
        curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE);
        curl_setopt($ch, CURLOPT_PROXY, $proxy);
    }
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, $ref_url);

    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    ob_start();
    return curl_exec ($ch); // execute the curl command
    ob_end_clean();
    curl_close ($ch);
    unset($ch);
}
08.08.2012
Новые материалы

Создание кнопочного меню с использованием HTML, CSS и JavaScript
Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

Внедрите OAuth в свои веб-приложения для повышения безопасности
OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

Классы в JavaScript
class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..