CURL会话管理

时间:2011-08-08 23:05:51

标签: php session cookies curl session-cookies

我正在构建一个基于需要基本身份验证的API构建的应用程序。我已经做了很多调用并将CURL请求包含在我已经创建的类中,

我正在使用像我这样使用的饼干罐:

curl_setopt($curl_handle, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($curl_handle, CURLOPT_COOKIEFILE, "cookie.txt");

我试图通过使用cookie.txt保存会话来存储cookie,并且它一直很好用。然而,今天我遇到了一个惊人的发现。当其他人(在另一台计算机上)转到我的应用程序时,他们可以看到我的会话信息(可能是因为它使用的是与会话参考相同的文件)。我想也许我可以为每个访客生成一个新的“饼干罐”,但这可能在它投入生产时不起作用。用户数量至少会达到数千,所以我认为这意味着每次访问都需要一个cookie文件?

这似乎不实用,更不用说我必须以编程方式创建cookie文件。有没有人以前遇到过这个问题?任何建议都是真正的帮助。

也许有一个CURL setopt解决方案可以在访问中唯一地分发cookie?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果你可以将cookie暴露给用户,如果你打开curl_setopt($ curl_handle,CURLOPT_HEADER,1),那么curl exec返回的标题将出现在内容的顶部,你可以将这些内容与内容的顶部进行匹配,并将它们传递给客户端浏览器以进行保留,然后将任何用户cookie通过curl进程传递回下一个请求。

我之前做过的一些简单的事情:

  if(is_array($_COOKIE))
  {
    foreach($_COOKIE as $cookiename => $cookievalue)
    {
      if($cookievalue)
      {
        if(get_magic_quotes_gpc())
        {
          $cookievalue = stripslashes($cookievalue);
        }
        $cookies[] = $cookiename .'='. urlencode($cookievalue);
      }
    }
    if(is_array($cookies))
    {
      curl_setopt($curl_handle, CURLOPT_COOKIE,implode('; ',$cookies));
    }
  }

在卷曲执行后

  preg_match_all('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si', $curl_result, $header_matches);
  $headers = split("\r\n", str_replace("\r\n\r\n",'',array_pop($header_matches[0])));
  if(is_array($headers))
  {
    foreach ($headers as $header)
    {
      preg_match('#(.*?)\:\s(.*)#', $header, $header_matches);
      if(isset($header_matches[1]))
      {
        $headers[$header_matches[1]] = $header_matches[2];
      }
      // SET THE COOKIE
      if($header_matches[1] == 'Set-Cookie')
      {
        header('Set-Cookie: ' . $header_matches[2],false);
      }
    }
  }
  # Remove the headers from the response body
  $curl_result = preg_replace('%HTTP/\\d\\.\\d.*?(\\r\\n|\\n){2,}%si','',$curl_result);