Curl 无法正确识别 cookie 中的过期值

2023-12-04

我正在尝试使用curl 登录pinterest.com。我得到以下请求-响应流程:

  1. GET-请求登录表单并抓取隐藏字段(csrftoken)
  2. POST-请求登录凭据(电子邮件和密码)和抓取的 csrf 令牌
  3. 接收登录会话 Cookie

使用 Curl,我可以看到发送和接收的以下标头:

 GET /login/?next=%2F HTTP/1.1
 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
 Host: pinterest.com
 Referer:
 Accept: text/html,application/xhtml+xml,application/xml,*/*
 Accept-Language: de-de,en-us
 Connection: keep-alive

 HTTP/1.1 200 OK
 Content-Type: text/html; charset=utf-8
 Date: Tue, 10 Apr 2012 15:03:24 GMT
 ETag: "45d6a85f0ede46f13f4fc751842ce5b7"
 Server: nginx/0.8.54
 Set-Cookie: csrftoken=dec6cb66064f318790c6d51e3f3a9612; Max-Age=31449600; Path=/
 Set-Cookie: _pinterest_sess="eJyryMwNcTXOdtI3zXcKNq0qznIxyXVxK/KqSsy3tY8vycxNtfUN8a3yc3E09nXxLPdztLVVK04tLs5MsfXNAopVpVf6VnlW+Qba2gIAuqgZIg=="; Domain=pinterest.com; HttpOnly; expires=Tue, 17-Apr-2012 15:03:24 GMT; Max-Age=1334675004; Path=/
 Vary: Cookie, Accept-Encoding
 Content-Length: 4496
 Connection: keep-alive

所以在步骤1之后,csrftoken和_pinterest_sess这两个cookie就被设置了。但是查看 cookiejar 文件(我使用 CURLOPT_COOKIEFILE 和 CURLOPT_COOKIEJAR 让curl 处理 cookie 处理)显示以下内容:

   # Netscape HTTP Cookie File
   # http://curl.haxx.se/rfc/cookie_spec.html
   # This file was generated by libcurl! Edit at your own risk.

   pinterest.com        FALSE        /        FALSE        1365519805        csrftoken        dec6cb66064f318790c6d51e3f3a9612
   #HttpOnly_.pinterest.com        TRUE        /        FALSE        -1626222087        _pinterest_sess        "eJyryMwNcTXOdtI3zXcKNq0qznIxyXVxK/KqSsy3tY8vycxNtfUN8a3yc3E09nXxLPdztLVVK04tLs5MsfXNAopVpVf6VnlW+Qba2gIAuqgZIg=="

首先要注意的是 _pinterest_sess cookie 行前面的#HttpOnly_。我只是假设curl 可以很好地处理这个问题。但进一步看,我们可以看到负值被设置为到期日期:-1626222087

我不知道这是从哪里来的,因为 cookie 设置为“expires=Tue, 17-Apr-2012 15:03:24 GMT”(从今天算起,大约是未来 7 天)。

在下一个请求中,curl 将不会设置 _pinterest_sess cookie:

 POST /login/?next=%2F HTTP/1.1
 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
 Host: pinterest.com
 Referer: https://pinterest.com/login/?next=%2F
 Cookie: csrftoken=dec6cb66064f318790c6d51e3f3a9612
 Accept: text/html,application/xhtml+xml,application/xml,*/*
 Accept-Language: de-de,en-us
 Connection: keep-alive
 Content-Length: 123
 Content-Type: application/x-www-form-urlencoded

 HTTP/1.1 302 FOUND
 Content-Type: text/html; charset=utf-8
 Date: Tue, 10 Apr 2012 15:05:26 GMT
 ETag: "d41d8cd98f00b204e9800998ecf8427e"
 Location: http://pinterest.com/
 Server: nginx/0.8.54
 Set-Cookie: _pinterest_sess="eJzLcssPCy4NTclIjvAOrjQzyywoCChISgvLDi+2tY9PrSjILEottvUN8a3yc4k09gtxrfRLt7VVK04tLs5MAYonV/qGeFb4ZkWW+4LES4tTi+KBEv4u6UZ+WYEmvlm+QOxZ6R/iWOEbEmgLAKNfJps="; Domain=pinterest.com; HttpOnly; expires=Tue, 17-Apr-2012 15:05:26 GMT; Max-Age=1334675126; Path=/
 Vary: Cookie
 Content-Length: 0
 Connection: keep-alive

在响应中,由于curl 没有发送最后一个cookie,因此设置了另一个_pinterest_sess cookie。

目前,我不知道我是否做错了什么,或者curl是否无法正确解析cookie中的过期值。

任何帮助将不胜感激 :)

// 编辑 还有一件事: 根据http://opensource.apple.com/source/curl/curl-57/curl/lib/cookie.c函数curl_getdate()用于提取日期。有关该函数的文档列出了一些示例(http://curl.haxx.se/libcurl/c/curl_getdate.html):

  • 1994 年 11 月 6 日,星期日 08:49:37 GMT
  • 94 年 11 月 6 日星期日 08:49:37 GMT
  • 1994 年 11 月 6 日星期日 08:49:37
  • 1994 年 11 月 6 日 08:49:37 GMT
  • 94 年 11 月 6 日 08:49:37 GMT
  • 1994 年 11 月 6 日 08:49:37
  • 1994 年 11 月 6 日 08:49:37
  • 94 年 11 月 6 日 08:49:37
  • 1994 年 11 月 6 日 08:49:37 GMT
  • 2094 年 11 月 6 日 08:49:37
  • 星期日 94 11 月 6 日 08:49:37
  • 1994年11月6日
  • 94 年 11 月 6 日
  • 94 年 11 月 6 日星期日
  • 1994年11月6日
  • 周日/11 月/6/94/GMT
  • 欧洲中部时间 1994 年 11 月 6 日,星期日 08:49:37
  • 1994 年 11 月 6 日 08:49:37 美国东部时间
  • 2004 年 9 月 12 日,星期日 15:05:58 -0700
  • 2004 年 9 月 11 日,星期六 21:32:11 +0200
  • 20040912 15:05:58 -0700
  • 20040911 +0200

它们都不符合上述到期日期“Tue, 17-Apr-2012 15:03:24 GMT”,因为所有带有连字符的示例仅使用 2 位数字年份。


由于 32 位有符号整数值的限制,您的计算机遇到了问题。

服务器设置一个 cookieMax-Age未来 1334675004 秒。

Max-Age=1334675004

您在这里发布了您的问题 @ 2012-04-10 15:13:24Z。这是 1334070804 的 UNIX 时间戳。如果向其中添加 1334675004,并在进行整数往返时考虑 32 位整数限制 2147483647,您将得到:-1626221485:

  1334070804
+ 1334675004
------------
 -1626221485

正如数字所示,看起来服务器确实误解了 Max-Age 属性,如果将每个值相互减去,则大约有 7 天(以秒为单位)的增量(604200 = ~6.99 天,差异是因为 cookie的设置早于您在此处发布问题的时间)。然而 Max-Age 是秒的增量,而不是绝对的 UNIX 时间戳。

尝试提高PHP_INT_MAX使用您的 PHP 版本,或者针对 64 位进行编译,这应该可以防止出现负数。然而,服务器的 max-age 计算仍然被破坏。您可能需要联系 pinterest.com 并报告问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Curl 无法正确识别 cookie 中的过期值 的相关文章

  • post php mysql 的拆分关键字

    我有一个表存储帖子 ID 它的标签如下 Post id Tags 1 keyword1 keyword2 keyword3 我想循环遍历该表中的每一行并执行以下操作 将关键字1 关键字2 关键字3放入新表中 word id word val
  • 无法显示 Laravel 欢迎页面

    我的服务器位于 DigitalOcean 云上 我正在使用 Ubuntu 和 Apache Web 服务器 我的家用计算机运行的是 Windows 7 我使用 putty 作为终端 遵循所有指示https laracasts com ser
  • 根据用户角色将帖子状态更改为待处理

    我有会员网站 用户必须付费才能订阅 当用户订阅时 他的角色变为 成员 现在可以发布到名为 用户配置文件 的自定义帖子类型 我想要做的是将所有已发布帖子的状态更改为该帖子类型中的待处理 例如 如果用户角色更改为 已过期 我尝试了这个 但似乎没
  • 我可以使用 WGET 生成给定 URL 的网站的站点地图吗?

    我需要一个可以抓取网站并以纯文本或类似格式返回所有已抓取页面的列表的脚本 我将把它作为站点地图提交给搜索引擎 我可以使用 WGET 生成网站的站点地图吗 或者有没有一个 PHP 脚本可以做同样的事情 wget spider recursiv
  • 如何使用 Laravel Eloquent 创建多个Where子句查询?

    我正在使用 Laravel Eloquent 查询构建器 并且我有一个查询 我想要一个WHERE多个条件的子句 它可以工作 但并不优雅 Example results User where this 1 gt where that 1 gt
  • 什么时候适合在 PHP 中使用引用传递?

    在C 中 如果将一个大数组传递给函数 则需要通过引用传递它 这样它就不会被复制到新函数中浪费内存 如果您不想修改它 可以通过 const 引用传递它 任何人都可以验证通过引用传递也可以节省我在 PHP 中的内存吗 我知道 PHP 不像 C
  • VB 脚本 Documents.Open 抛出 424 错误

    所以我有一个vbs脚本 Function test2open sSourceFile sPDFFile Dim wApp As Word Application Dim wDoc As Word Document logStream wri
  • 如何在 Codeigniter 中将变量从一个控制器传递到另一个控制器

    我刚刚开始学习 Code Igniter 我想知道如何将变量从一个控制器 first cont php 传递到另一个控制器 second cont php 任何帮助 将不胜感激 提前致谢 这将取决于具体情况 如果您想将数据保留一段时间 那么
  • PHP 计算字符串出现次数的最快方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 字符串 S 的前缀是 S 的任何前导连续部分 例如 c 和 cod 是字符串 codility 的前缀 为简单起见 我们要求前缀非空 字符串 S
  • WordPress Tax_query“和”运算符未按预期运行

    我有一个自定义帖子类型image自定义分类法称为图片标签 它像类别一样分层 以下是可能使用的标签的一些示例 Structure id 25 House id 56 Skyscraper Nature Animal Plant id 41 因
  • PHP表单提交后如何显示成功消息?

    这是代码 我想要这样 表单提交 gt page2 php gt 重定向 gt page1 php 这是消息 弹出窗口或其他内容 page1 php
  • 第一个选项为空的选择框

    如何将选择框中的第一个选项设置为空值 我正在从数据库获取数据 我想将选项默认设置为 请选择一个选项 我找到 default gt Please select 不适用于 HTML5 必需属性 这确实有效 listOfValues 1 gt C
  • php , simple_html_dom.php, 获取所选选项

    我有一个像这样的 html 块 localurl
  • 无法使用 php 将大文件上传到服务器

    我无法将大文件加载到服务器 问题出在该文件中 FILES filename tmp name 如果文件稍大于 2mb 则为空 我尝试更改 php ini 中的变量 upload max filesize 700M post max size
  • Joomla getUser() 不显示更新的用户数据

    下面的代码允许我在用户的 Joomla 个人资料的个人资料页面中显示用户名 鉴于我已经覆盖了模板以获得我想要的外观和感觉 user JFactory getUser if user gt guest echo You are logged
  • 在 TCPDF 中设置背景颜色

    我已经手动设置了第一页的背景颜色 如下所示 pdf gt AddPage pdf gt SetFillColor 52 21 0 76 pdf gt Rect 0 0 pdf gt getPageWidth pdf gt getPageHe
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • 无法使用模式 r: fopen(): AWS Elastic Beanstalk 打开

    错误 无法使用模式 r fopen 打开 文件名不能为空当我尝试上传较大的文件 超过 5MB 时 我不断收到此错误 我已将 PHP 应用程序上传到 AWS Elastic Beanstalk 并将文件上传到 AWS S3 我的代码中甚至没有
  • 是否可以在 php.ini 中指示 PHP 使用 postfix 配置?

    是否可以配置 PHP 使用 postfix 的配置集发送电子邮件 WordPress 通过 PHPMailer 依赖于 php ini 中的这些设置是否正确 SMTP localhost http php net smtp port smt
  • 使用 ActiveRecord 和 Yii2 记录实际的 SQL 查询?

    我正在这样做 students Student find gt all return this gt render process array students gt students 然后在视图中 foreach students as

随机推荐