Вопрос по php – Curl не распознает истекающее значение в cookie правильно

4

Я пытаюсь выполнить вход на pinterest.com с помощью curl. Я получил следующий запрос-ответ-поток:

  1. GET-Request the login form and scrape hidden fields (csrftoken)
  2. POST-Request login credentials (mail and pw) and scraped csrftoken
  3. Receive Session Cookie for login

Используя 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=="

Первое, на что нужно обратить внимание, это #HttpOnly_ в предшествующей строке cookie _pinterest_sess. Я просто предполагаю, что локон справится с этим просто отлично. Но, посмотрев дальше, можно увидеть, что отрицательное значение установлено в качестве срока годности: -1626222087

Я не знаю, откуда это происходит, потому что для файла cookie установлено значение "expires = Tue, 17-Apr-2012 15:03:24 GMT" (что составляет около 7 дней в будущем, считая с сегодняшнего дня).

При следующем запросе файл cookie _pinterest_sess не будет установлен 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

В ответе устанавливается другой файл cookie _pinterest_sess, так как curl не отправил последний файл.

В настоящее время я не знаю, делаю ли я что-то неправильно, или curl просто не в состоянии правильно проанализировать значение expires в файле cookie.

Любая помощь будет принята с благодарностью :)

// редактировать Еще кое-что: В соответствии сhttp://opensource.apple.com/source/curl/curl-57/curl/lib/cookie.c функция curl_getdate () используется для извлечения даты. В документации по этой функции перечислены некоторые примеры (http://curl.haxx.se/libcurl/c/curl_getdate.html):

  • Sun, 06 Nov 1994 08:49:37 GMT
  • Sunday, 06-Nov-94 08:49:37 GMT
  • Sun Nov 6 08:49:37 1994
  • 06 Nov 1994 08:49:37 GMT
  • 06-Nov-94 08:49:37 GMT
  • Nov 6 08:49:37 1994
  • 06 Nov 1994 08:49:37
  • 06-Nov-94 08:49:37
  • 1994 Nov 6 08:49:37 GMT
  • 08:49:37 06-Nov-94
  • Sunday 94 6 Nov 08:49:37
  • 1994 Nov 6
  • 06-Nov-94
  • Sun Nov 6 94
  • 1994.Nov.6
  • Sun/Nov/6/94/GMT
  • Sun, 06 Nov 1994 08:49:37 CET
  • 06 Nov 1994 08:49:37 EST
  • Sun, 12 Sep 2004 15:05:58 -0700
  • Sat, 11 Sep 2004 21:32:11 +0200
  • 20040912 15:05:58 -0700
  • 20040911 +0200

Ни один из них не соответствует вышеуказанной дате истечения срока действия "Вторник, 17 апреля 2012 года, 15:03:24 по Гринвичу" потому что все примеры с дефисами используют только 2-значные годы ..

& quot; вт, 17 апреля 2012 г. 15:03:24 GMT & quot; выглядит как JavaScriptDate.toGMTString() вид продукции. У меня были проблемы с манипулированием между этим и PHP раньше, поскольку это не тот формат, который, кажется, распознается форматированием даты и времени в PHP (используемомstrtotime() например) ... может быть стоит попробовать сгенерировать(int) на основе временных меток вместо CD001
Нашли ли вы какое-либо решение проблемы? S. A. Malik

Ваш Ответ

3   ответа
3

Вы столкнулись с проблемой на вашем компьютере из-за ограничений 32-битных целых чисел со знаком.

Сервер устанавливает куки сMax-Age 1334675004 секунд в будущем.

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_INT_MAX с вашей версией PHP или компиляцией под 64-битные, это должно предотвратить отрицательные числа Тем не менее, расчет максимального возраста все еще не работает с сервером. Возможно, вы захотите связаться с pinterest.com и сообщить о проблеме.

1

Похожеpinterest.com используетMax-age неправильно, и именно поэтому curl удаляет этот файл cookie.

Из вашего примераMax-age содержит метку времени дляTue, 17-Apr-2012 15:03:24 GMT, в то время как он должен содержать количество секунд от времени запроса до этой даты -604800 (судя по времени запроса -Date заголовок)

То, что делает curl, добавляетMax-age значение текущей метки времени и сохранение его как 32-разрядное целое число со знаком, следовательно-1626222087.

Что касается решения - вы можете попробовать связаться с pinterest и сообщить об ошибке.

0

На самом деле вам не нужно связываться с сайтом pinterest, поскольку не требуется отправлять обратно на сервер максимальный возраст файлов cookie (если вы будете использовать файл cookie в течение короткого периода времени или вы можете рассчитать для себя правильный максимальный возраст). Просто переверните знак минус, и он будет работать, означая, что он будет отправлен обратно на сервер. И это было не все, что тебе нужно делать. Иногда, в зависимости от представленной страницы входа, вам также нужно анализировать скрытые поля (где находятся токены CSRF и которые должны совпадать с тем же значением токена в cookie). Кроме того, иногда требуется изменить файлы cookie (сбросить значения файлов cookie). Таким образом, веб-сайт pinterest становится все труднее и труднее войти в систему с помощью инструментов автоматического входа и очистки экрана. И недавно они изменили работу своего сайта. Так что все вышеперечисленные пункты не работают сейчас. На самом деле вы не знаете, когда они изменят способ входа в систему. Вы должны попробовать и "угадать" когда произойдет изменение На самом деле такое отношение должно быть не к разработчикам, а к тем, кто представляет угрозу безопасности системы (злоумышленникам). Вы также должны подумать о законности вышеупомянутых пунктов. Pinterest имеет API (хотя сейчас он недоступен), так что это лучший и самый правильный способ использовать этот API (пожалуйста, смотритеhttps://github.com/kellan/pinterest.api.php). Там вы обмениваетесь сообщениями в формате json. Последний вариант использования m.pinterest.com, предназначенный для мобильных устройств, и его было бы просто использовать, например, parse one login html для скрытых полей ввода и повторно отправить форму с правильными значениями (чтобы использовать ее, вы снова столкнулись с проблемами легальности). Пожалуйста, проконсультируйтесь с сайтом pinterest перед использованием инструментов, похожих на curl, или подождите, пока не появится apit api. Да, в системе есть некоторые улучшения, такие как получение ответов json, что положит конец скринингу экрана, но это не означает совершенно новый API. Также прямо сейчас они (казалось бы) внедрили веб-сервисы, restful, api и ajax-запросы, которые снова являются шагами к положительному улучшению. Есть много дискуссий в сети по этому вопросу, поэтому, пожалуйста, обратитесь к ним за подробной информацией.

Похожие вопросы