我正在尝试使用curl在pinterest.com上登录。我收到了以下请求 - 响应流程:
使用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_sess cookie行之前的#HttpOnly_。我只是假设卷曲处理得很好。但进一步观察,可以看到负值被设定为到期日:-1626222087
我不知道它来自哪里,因为cookie设置为“expires = Tue,2012年4月17日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
在响应中,设置了另一个_pinterest_sess cookie,因为curl没有发送最后一个。
目前,我不知道我做错了什么,或者curl是否无法正确解析cookie中的expires值。
非常感谢任何帮助:)
//编辑 还有一件事: 根据{{3}},函数curl_getdate()用于提取日期。该函数的文档列出了一些示例(http://opensource.apple.com/source/curl/curl-57/curl/lib/cookie.c):
它们都不符合上述截止日期“星期二,2012年4月17日15:03:24 GMT”,因为所有带连字符的示例仅使用2位数年份。
答案 0 :(得分:3)
由于32位有符号整数值的限制,您的计算机出现问题。
服务器将来设置一个 Max-Age 为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位进行编译,这应该可以防止出现负数。但是,服务器仍然会破坏max-age计算。您可能想联系pinterest.com并报告问题。
答案 1 :(得分:1)
pinterest.com
看起来错误地使用Max-age
,这就是curl正在删除此Cookie的原因。
在您的示例中,Max-age
包含Tue, 17-Apr-2012 15:03:24 GMT
的时间戳,同时它应包含从请求时间到此日期的秒数 - 604800
(根据请求时间判断 - {{1} }标题)
curl正在做的是将Date
值添加到当前时间戳并将其保存为带符号的32位整数,因此Max-age
。
至于解决方案 - 您可以尝试联系pinterest并报告错误。
答案 2 :(得分:0)
实际上,您不需要联系pinterest网站,因为它不需要发送回服务器cookie最大年龄(如果您将在短时间内使用cookie,或者您可以计算自己正确的最大年龄)。只需翻转减号即可,这意味着它将被发送回服务器。并不是你必须做的全部。有时,根据提供的登录页面,您还必须包括隐藏字段(CSRF令牌所在的位置,并且必须与cookie中的相同令牌值匹配)。此外,它有时需要更改cookie(重置cookie值)。因此,使用自动登录工具和屏幕抓取功能,使用最好的网站变得越来越难以登录。最近他们改变了网站的运作方式。所以上面提到的所有要点现在都不起作用。实际上你并不知道他们何时会改变登录的工作方式。当变化发生时,你必须尝试“猜测”。实际上,这种态度应该是针对开发人员,而不是威胁系统安全的人(入侵者)。您还必须考虑上述要点的合法性问题。 Pinterest有API(尽管它现在已经关闭)所以它是使用该API的最佳和最正确的方法(请参阅https://github.com/kellan/pinterest.api.php)。在那里,您正在以json格式交换消息。使用m.pinterest.com的最后一个选项是用于移动设备,并且使用像parce一个登录html用于隐藏输入字段并使用正确的值重新提交表单是非常明确的(使用它你也会再次面临合法性问题)。在使用curl like工具之前请先咨询pinterest网站或等到pinterest api启动。是的,系统有一些改进,例如获取json响应,这会结束屏幕抓取,但这并不意味着全新的api。此外,他们(貌似)实施了Web服务,restful,api并采取了ajax请求,这些请求又是积极改进的步骤。网上有很多关于这个问题的讨论,所以请参考它们获取详细信息。