Php file_get_contents не захватывает определенную группу файлов cookie - PullRequest
0 голосов
/ 26 апреля 2018

Я создал скрипт для автоматической загрузки файла, созданного приложением, которое отправляет уведомление по электронной почте пользователю при его создании. Этот сценарий входит в систему, затем выполняется второй раз с некоторыми элементами сеанса, установленными на хост-сайте, и может загрузить файл.

Недавно хост-сайт создал обновление с некоторыми дополнительными проверками, и так как мой скрипт не работал. Я реализовал все, что связано с обновленным процессом проверки, чтобы в основном гарантировать, что атаки XSS смягчены, но я столкнулся с дорожным блоком, где теперь набор значений GUID больше не находится в «Set-Cookie:».

Сначала я делаю GET на страницу входа, чтобы получить уникальные значения для этой попытки.

$url = "https://loginurl.com/";

$options = array(
    'https' => array(
        'header' => "",
        'method' => 'GET',
        'content' => "",
    ),
);
$post_context = stream_context_create($options);

$post_raw_result = file_get_contents($url, false, $post_context);

$unique_headers = $http_response_header;

Я назначаю http_response_header и затем выбираю некоторые значения, которые мне нужны, но он не содержит всех файлов cookie, которые я вижу в браузере.

Я работал с curl, выполняя curl из shell_exec () и последние несколько недель, и file_get кажется мне лучшим вариантом, но у меня нет идеала, почему я больше не могу видеть эти элементы GUID .. Я вижу их в Chrome или Mozilla при проверке связи. Я подумал, что это может быть что-то с несколькими куки, и попробовал несколько вещей, таких как:

$cookies_array = array();
foreach($http_response_header as $s)
{
  if (preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|', $s, $parts))
  {
    $cookies_array[] = $parts[1] . '=' . $parts[2];
  }
}

найдено здесь и в нескольких других темах для похожих вопросов, но, похоже, эта информация не содержит никакой дополнительной информации.

Мне посчастливилось найти больше данных, проверив $ _COOKIE, но все еще не содержал 2 из необходимых мне значений GUID.

Я даже перешел к почтальону и увидел там те же файлы cookie, которые я не могу записать с помощью php. Любые идеи, почему они не будут в http_header_response или где еще искать?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Несколько пунктов, чтобы включить, чтобы решить эту проблему. 1. переехал в локон 2. удалить длину контента (это вызывало перенаправление после таймаута каждый раз, когда установлено) 3. Сделайте второй запрос, сохраните куки и представьте все сохраненные куки.

Пришлось использовать все варианты ниже

    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "",
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_COOKIEJAR => 'cookie.txt',
    CURLOPT_COOKIEFILE => 'cookie.txt',
    CURLOPT_SSL_VERIFYPEER => false,
0 голосов
/ 26 апреля 2018

Может быть http://php.net/manual/en/reserved.variables.httpresponseheader.php - первый комментарий:

Обратите внимание, что оболочка HTTP имеет жесткий предел в 1024 символа для строк заголовка. Любой полученный HTTP-заголовок, который длиннее этого, будет игнорироваться и не будет отображаться в $ http_response_header.

Если нет, я бы рекомендовал использовать CURL

$curl = curl_init();
curl_setopt($curl, CURLOPT_HEADER, 1); // This is what you looking for
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);

// Your other options - see http://php.net/manual/en/function.curl-setopt.php

$response = curl_exec($curl);

// Check for $response success
$header = substr($response, 0, curl_getinfo($curl, CURLINFO_HEADER_SIZE)); // There you will get headers

Или вы можете получить эту головную боль, и у вас что-то вроде подагры - http://goutte.readthedocs.io/en/latest/, которая обрабатывает файлы cookie для вас.

...