【问题标题】:PHP - Using cURL to store cookie session into variable / memoryPHP - 使用 cURL 将 cookie 会话存储到变量/内存中
【发布时间】:2014-02-21 22:59:45
【问题描述】:

我试图避免 cURL 通过“CURLOPT_COOKIEJAR”将 cookie 会话存储到实际文件中。所以我创建了一个方法来捕获/解析 cookie 到一个局部变量 - 然后通过“CURLOPT_COOKIE”使用它来恢复 cookie 会话。

我通过

切掉了 cookie
preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies);

要使用“CURLOPT_COOKIE”,我们使用 key=value 并通过“;”将它们分开。但是(据我所知), CURLOPT_COOKIE 不允许您输入各种标志,即到期、安全标志等。

2014 年 1 月 29 日下午 6:45 更新

所以我认为我的问题实际上发生在 CURLOPT_FOLLOWLOCATION 发生的地方。我认为这与国旗无关。在跟随一个新位置时,我的手动 cookie 会话似乎没有更新(即,一个站点有 2-3 个重定向来附加各种 cookie/会话)。这实际上是有道理的,因为利用 CURLOPT_COOKIEJAR 将直接获取/更新在标头重定向上发送的 cookie。因此,我尝试在获取/附加最新的 cookie 时创建手动重定向路径 - 但是由于某种原因,这种方法不起作用。

2014 年 1 月 30 日下午 4:22 更新

几乎搞定了。将很快更新答案。事实证明我的方法工作得很好,只需正确跳转手动重定向页面即可。

2014 年 1 月 30 日下午 4:51 更新 问题已解决 - 在下面回答我自己。

【问题讨论】:

  • 但是你可以使用 curlopt header 来设置cookie,嗯?
  • @MaximKhan-Magomedov 我们使用 curlopt 标头来设置 cookie,但不用于存储。 cURL 使用 cookiejar - 但这需要磁盘上的固定文件,这是您想要避免的(在大规模生产环境中)。将 cookie 会话保留在磁盘上存在安全风险。

标签: php session cookies curl


【解决方案1】:

所以事实证明我实际上是正确地做这件事并且我的假设是正确的。

  1. 将 cookie 会话保存在变量中(与 CURLOPT_COOKIEJAR 相比)。 *确保您已启用 CURLOPT_HEADER 和 CURLINFO_HEADER_OUT。*

  2. CURLOPT_FOLLOWLOCATION 必须设置为 false。否则您的 cookie 将无法正确发送(这是 CURLOPT_COOKIEJAR 最擅长的地方)。

  3. 使用 preg_match_all 提取 cookie。然后使用 strpos 查找“=”的第一次出现。一些网站使用编码并包含不能与“explode”一起使用的“=”。

    $data        = curl_exec($curl);
    $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $header      = substr($data, 0, $header_size);
    
    preg_match_all("/^Set-cookie: (.*?);/ism", $header, $cookies);
    foreach( $cookies[1] as $cookie ){
        $buffer_explode = strpos($cookie, "=");
        $this->cookies[ substr($cookie,0,$buffer_explode) ] = substr($cookie,$buffer_explode+1);
    }
    
  4. 在进行下一次 curl 调用时,将 cookie var/object 重新调用为 CURLOPT_COOKIE。

    if( count($this->cookies) > 0 ){
        $cookieBuffer = array();
        foreach(  $this->cookies as $k=>$c ) $cookieBuffer[] = "$k=$c";
        curl_setopt($curl, CURLOPT_COOKIE, implode("; ",$cookieBuffer) );
    }
    

这将允许您保持最新的变量(即更改会话)不变。

希望这对遇到此问题的人有所帮助!

【讨论】:

    猜你喜欢
    • 2014-10-14
    • 2023-03-25
    • 2013-08-06
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多