Php file_get_contents 没有捕获特定的 cookie 组

Php file_get_contents not capturing certain group of cookies

我创建了一个脚本来自动下载一个应用程序创建的文件,该应用程序在生成文件时会向用户发送电子邮件通知。此脚本登录,然后第二次执行,并在主机站点上设置了一些会话项,并能够下载文件。

最近,主机站点创建了一个更新,其中包含一些额外的验证,因为我的脚本一直没有运行。我已经实施了与更新的验证过程相关的所有内容,以确保基本上减轻 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,从 shell_exec() 执行 curl,在过去的几周里,file_get 似乎是我的最佳选择,但我不知道为什么我看不到这些 GUID 项目不再存在。我在检查通信时可以在 chrome 或 Mozilla 中看到它们。我认为它可能有多个 cookie,并尝试了几个项目,例如:

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

发现 here 和其他几个类似问题的线程,但这似乎没有捕获任何其他信息。

我很幸运地通过检查 $_COOKIE 找到了更多数据,但仍然没有包含我需要的 2 个 GUID 值。

我什至转向邮递员,可以看到那里定义了我似乎无法用 php 捕获的相同 cookie。有什么想法为什么他们不在 http_header_response 或其他地方吗?

可能是 http://php.net/manual/en/reserved.variables.httpresponseheader.php - 第一条评论:

Note that the HTTP wrapper has a hard limit of 1024 characters for the header lines. Any HTTP header received that is longer than this will be ignored and won't appear in $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。

要合并几个项目来解决这个问题。 1.移动卷曲 2.删除内容长度(这导致每次设置时重定向跟随超时) 3. 发出第二个请求并存储 cookie 并显示所有存储的 cookie。

必须使用以下所有选项

    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,