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,
我创建了一个脚本来自动下载一个应用程序创建的文件,该应用程序在生成文件时会向用户发送电子邮件通知。此脚本登录,然后第二次执行,并在主机站点上设置了一些会话项,并能够下载文件。
最近,主机站点创建了一个更新,其中包含一些额外的验证,因为我的脚本一直没有运行。我已经实施了与更新的验证过程相关的所有内容,以确保基本上减轻 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,