当前位置: 首页 > 知识库问答 >
问题:

Curl无法正确识别cookie中的expires值

赵选
2023-03-14

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

  1. GET请求登录表单并清除隐藏字段(csrftoken)
  2. POST请求登录凭据(邮件和密码)和scraped csrftoken
  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步之后,设置了两个cookie csrfToken和_pinterest_sess。但是查看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_sesscookie行前面的#HttpOnly_。我只是假设curl可以很好地处理这个问题。但是进一步观察,可以看到一个负值被设置为到期日期:-1626222087

我不知道这是从哪里来的,因为cookie设置为“过期=星期二,17-Apr-2012 15:03:24 GMT”(大约是未来的7天,从今天开始计算)。

在下一次请求中,_pinterest_sesscookie不会由curl设置:

 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

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

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

任何帮助都将不胜感激:)

//再编辑一点:根据http://open source . apple . com/source/curl/curl-57/curl/lib/cookie . c使用html" target="_blank">函数curl_getdate()提取日期。关于该函数的文档列出了一些示例(http://curl . haxx . se/libcurl/c/curl _ getdate . html):

    < li >太阳,1994年11月6日08:49:37 GMT < Li > 94年11月6日星期日08:49:37 GMT 孙1994年11月6日08时49分37秒 < Li > 1994年11月6日08:49:37 GMT < Li > 94年11月6日08:49:37 GMT < Li > 1994年11月6日08时49分37秒 < Li > 1994年11月6日08时49分37秒 < Li > 94年11月6日08时49分37秒 < li>1994年11月6日08:49:37 GMT 1994年11月6日08时49分37秒 < Li > 94年11月6日星期日08:49:37 <李> 1994年11月6日 94年11月6日 94年11月6日星期日 <李> 1994。11月6日 < Li > 1994年11月6日星期日/GMT 孙,1994年11月6日欧洲中部时间08:49:37 < li >美国东部时间1994年11月6日08:49:37 孙,2004年9月12日15:05:58 -0700 < Li > 2004年9月11日星期六21:32:11 0200 < li>20040912 15:05:58 -0700 < li>20040911 0200

没有一个与上述到期日期“2012年4月17日,星期二,15:03:24 GMT”匹配,因为所有带连字符的示例都只使用2位数的年份。。

共有3个答案

麻宜春
2023-03-14

实际上,您不需要联系pinterest站点,因为它不需要发送回服务器cookie max-age(如果您使用cookie的时间很短,或者您可以计算自己正确的max-age)。只要翻转减号,它就会工作,这意味着它将被发送回服务器。这并不是你必须做的全部。有时,根据所呈现的登录页面,您还必须分割隐藏字段(CSRF令牌所在的位置,并且必须与cookie中的相同令牌值匹配)。此外,有时还需要更改cookie(重置cookie值)。因此,pinterest网站使用自动登录工具和屏幕抓取越来越难登录。最近,他们改变了网站的功能。因此,上述所有要点现在都不起作用。实际上,您并不知道他们什么时候会更改登录的工作方式。当变化发生时,你必须试着“猜测”。实际上,这种态度不应该针对开发人员,而应该针对那些威胁系统安全的人(入侵者)。你也必须考虑上述几点的合法性问题。Pinterest有API(虽然现在已经关闭),所以这是使用该API的最佳和最正确的方式(请参阅https://github.com/kellan/pinterest.api.php). 在这里,您以json格式交换消息。使用m.pinterest的最后一个选项。com是一个面向移动设备的网站,它努力使用parceone登录html作为隐藏的输入字段,并用正确的值重新提交表单(要使用它,您也会再次面临合法性问题)。在使用类似curl的工具之前,请咨询pinterest站点,或者等到pinterest api启动后再使用。是的,系统中有一些改进,比如获得json响应,从而结束了屏幕抓取,但这并不意味着全新的api。同时,现在他们(似乎)实现了web服务、restful、api和接受ajax请求,这再次朝着积极的改进迈出了一步。网上有很多关于这个问题的讨论,所以请参考他们了解详细信息。

江志业
2023-03-14

看来< code>pinterest.com未正确使用< code>Max-age,这就是curl删除此cookie的原因。

在您的示例中,Max age包含2012年4月17日星期二15:03:24 GMT的时间戳,而它应该包含从请求时间到该日期的秒数-604800

curl正在做的是将最大年龄值添加到当前时间戳并将其保存为有符号的32位整数,因此-1626222087

至于解决方案-您可以尝试联系pinterest并报告错误。

咸星波
2023-03-14

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

服务器设置一个最大年龄为1334675004秒的cookie。

Max-Age=1334675004

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

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

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

尝试使用您的PHP版本提升PHP_INT_MAX,或针对64位进行编译,这应该可以防止出现负数。然而,服务器仍然无法计算最大年龄。你可能想联系pinterest。com并报告问题。

 类似资料:
  • 生成PDF框 正如您所看到的,左侧的签名面板是无效的,但左侧的签名字段是存在的并且可以工作。 我用PDFTRON生成相同的PDF。这就是结果: 生成的PDF Tron 在这种情况下,左侧的签名面板正确显示签名字段的存在。 我想获得这第二个案例(正确),但我不明白为什么PDF框可以这样做。 多谢

  • 相对新的节点。js,尝试从Angular2获取一个js对象到我的节点。js路由,但我总是从本机对象解析器获得一个标准的“索引0处的意外标记”。 对象很好地到达我的节点工厂,但在发布到路由时失败。 这是被发送到路由的JSON: 这是我在开发人员控制台中收到的错误。 angular2.dev.js:23083异常:语法错误:位置0BrowserDomA的JSON中的意外令牌Sdapter.log错误@

  • 我一直在研究人脸识别考勤管理系统。我从头开始构建了管道,但最终,脚本在10个类中识别出了错误的面孔。我已经使用Tensorflow和Python实现了以下管道。 > 使用dlib的shape predictor捕捉图像、调整大小、对齐它们,并将它们存储在命名文件夹中,以便在执行识别时进行比较 将图像Pickle成文件,以便以后反序列化。 利用OpenCV实现MTCNN算法检测网络摄像头捕获的帧中的

  • 我正在尝试使用绝对定位将标签文本与其相应的输入字段对齐。然而,标签并没有将我的输入div识别为其父级,而似乎是相对于外部登录div定位标签文本。 HTML: CSS: 登录名和密码塞进表单的一角,而不是输入字段

  • 所以我和这个人有几乎完全一样的问题: Maven 安装 OSX 错误 不支持的主要.minor 版本 51.0 我认为问题出在我的符号链接中。我定义了$JAVA_HOME。bash_profile和java版本正确地报告了版本。然而,出于某种原因,mvn正在尝试使用旧版本的java。 这是我机器上所有东西的列表: 我想使用1.8。和mvn来识别它。 如果我运行这个: 然后如果我跑了: 我确实注意到

  • 我有以下序列