curlopt_cookiejar cookie php cookies curl

php - curlopt_cookiejar - Curl no reconoce el valor de expiración en la cookie correctamente



curl cookie jar php (3)

En realidad, no es necesario que se comunique con el sitio de pinterest ya que no es necesario volver a enviar la cookie a la edad máxima del cookie del servidor (si va a utilizar cookies durante un breve período de tiempo o puede calcular su edad máxima correcta). Simplemente voltee el signo menos y funcionará, lo que significa que será enviado de vuelta al servidor. Y no fue todo lo que tienes que hacer. A veces, dependiendo de la página de inicio de sesión presentada, también tiene que parcelar los campos ocultos (donde residieron los tokens CSRF y que tienen que coincidir con el mismo valor de token en la cookie). Además, a veces será necesario cambiar las cookies (restablecer los valores de las cookies). Por lo tanto, el sitio web de pinterest está haciendo cada vez más difícil el inicio de sesión utilizando herramientas de inicio de sesión automatizadas y haciendo screen scraping. Y recientemente han cambiado la forma en que funciona su sitio. Entonces, todos los puntos mencionados anteriormente no funcionan ahora. En realidad, no sabes realmente cuándo van a cambiar cómo funciona el inicio de sesión. Debes intentar "adivinar" cuando ocurre un cambio. En realidad, esa actitud debería ser hacia los desarrolladores, no hacia los que son amenazas a la seguridad del sistema (intrusos). También debe pensar en el tema de legalidad de los puntos mencionados anteriormente. Pinterest tiene API (aunque actualmente no funciona), por lo que es la forma mejor y más correcta de usar esa API (consulte https://github.com/kellan/pinterest.api.php ). Allí estás intercambiando mensajes en un formato json. Última opción para usar m.pinterest.com, que es para dispositivos móviles, y es muy sencillo utilizar parce one login html para campos de entrada ocultos y volver a enviar formularios con los valores correctos (para usarlo, también se enfrenta a problemas de legalidad). Consulte con el sitio pinterest antes de usar curl como herramientas o espere hasta que pinterest api esté activo. Sí, hay algunas mejoras en el sistema como obtener respuestas json que pone fin a la captura de pantalla, pero eso no significa api completamente nuevo. Además, ahora mismo (aparentemente) implementaron servicios web, descanso, api y solicitudes de ajax, que son pasos hacia una mejora positiva. Hay muchas discusiones en la red sobre este asunto, así que por favor refiérase a ellas para obtener información detallada.

Estoy intentando realizar un inicio de sesión en pinterest.com con curl. Obtuve el siguiente flujo de respuesta de solicitud:

  1. GET: solicite el formulario de inicio de sesión y raspe los campos ocultos (csrftoken)
  2. POST-Solicitar credenciales de inicio de sesión (correo y pw) y scraped csrftoken
  3. Recibir la cookie de sesión para iniciar sesión

Al utilizar Curl, puedo ver que se están enviando y recibiendo los siguientes encabezados:

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

Entonces, después del paso 1, se establecen las dos cookies csrftoken y _pinterest_sess. Pero una mirada en el archivo cookiejar (uso CURLOPT_COOKIEFILE y CURLOPT_COOKIEJAR para permitir que curl maneje el procesamiento de cookies) muestra lo siguiente:

# 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=="

Lo primero a tener en cuenta es el #HttpOnly_ que precede a la línea de cookies _pinterest_sess. Solo asumo que el rulo maneja eso bien. Pero mirando más allá, se puede ver que se establece un valor negativo como fecha de vencimiento: -1626222087

No sé de dónde viene eso, porque la cookie está configurada con "expira = mar, 17-abr-2012 15:03:24 GMT" (que está a unos 7 días en el futuro, contando a partir de hoy).

En la próxima solicitud, la cookie _pinterest_sess no se establecerá por 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

En la respuesta, se establece otra cookie _pinterest_sess ya que curl no envió la última.

Actualmente, no sé si estoy haciendo algo mal o si Curl simplemente no puede analizar correctamente el valor de caducidad de la cookie.

Cualquier ayuda sería muy apreciada :)

// editar Una cosa más: según http://opensource.apple.com/source/curl/curl-57/curl/lib/cookie.c la función curl_getdate () se usa para extraer la fecha. La documentación sobre esa función enumera algunos ejemplos ( http://curl.haxx.se/libcurl/c/curl_getdate.html ):

  • Dom, 06 de noviembre de 1994, 08:49:37 GMT
  • Domingo, 06-Nov-94 08:49:37 GMT
  • Dom 6 de noviembre 08:49:37 1994
  • 06 de noviembre de 1994, 08:49:37 GMT
  • 06-nov-94 08:49:37 GMT
  • 6 de noviembre 08:49:37 1994
  • 06 de noviembre de 1994, 08:49:37
  • 06-nov-94 08:49:37
  • 1994 6 de noviembre 08:49:37 GMT
  • 08:49:37 06-nov-94
  • Domingo 94 6 nov 08:49:37
  • 1994 6 de noviembre
  • 06-Nov-94
  • Dom 6 de noviembre 94
  • 1994. Nov.6
  • Dom / Nov / 6/94 / GMT
  • Dom, 06 de noviembre de 1994, 08:49:37 CET
  • 06 de noviembre de 1994, 08:49:37 EST
  • Dom, 12 de septiembre de 2004 15:05:58 -0700
  • Sáb, 11 de septiembre de 2004 21:32:11 +0200
  • 20040912 15:05:58 -0700
  • 20040911 +0200

Ninguno de ellos coincide con la fecha de caducidad mencionada anteriormente "martes, 17 de abril de 2012 15:03:24 GMT" porque todos los ejemplos con guiones solo usan años de 2 dígitos.


Está experimentando un problema en su computadora debido a los límites de los valores enteros con signo de 32 bits.

El servidor establece una cookie con la edad máxima de 1334675004 segundos en el futuro.

Max-Age=1334675004

Publicaste tu pregunta aquí @ 2012-04-10 15: 13: 24Z. Esa es una marca de tiempo de UNIX de 1334070804. Si agrega 1334675004 a ella y toma un límite entero de 32 bits de 2147483647 en cuenta mientras tiene una ida y vuelta entera, obtendrá: -1626221485:

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

Como muestran los números, parece que el servidor malinterpretó el atributo Max-Age, si restas cada valor de cada uno hay un circa delta de 7 días en segundos (604200 = ~ 6,99 días, la diferencia es porque la cookie fue configurado antes de que publicaras tu pregunta aquí). Sin embargo, Max-Age es el delta de segundos, no la marca de tiempo UNIX absoluta.

Intente subir PHP_INT_MAX con su versión de PHP, o compilar contra 64 bit, esto debería evitar números negativos. Sin embargo, el cálculo de max-age aún se rompe con el servidor. Es posible que desee ponerse en contacto con pinterest.com e informar el problema.


Parece que pinterest.com está usando Max-age incorrectamente, y es por eso que Curl está eliminando esta cookie.

Según su ejemplo, Max-age contiene la marca de tiempo para Tue, 17-Apr-2012 15:03:24 GMT , mientras que debe contener el número de segundos desde el momento de solicitud hasta esta fecha - 604800 (a partir del tiempo de solicitud - 604800 de Date )

Lo que curl está haciendo es agregar el valor de la Max-age a la marca de tiempo actual y guardarlo como un entero de 32 bits con signo, por -1626222087 tanto, -1626222087 .

En cuanto a la solución, puedes intentar contactar pinterest e informar un error.