PHP读取cookie文件

时间:2009-01-03 23:52:43

标签: php cookies

是否有任何帮助库可以在php中读取cookie文件。我的本地磁盘上有一个cookie文件,我想要一个更好的阅读方式。我目前只是按行阅读文件并解析出值。

7 个答案:

答案 0 :(得分:29)

如果你想要阅读Netscape的格式(例如curl以这种格式保存COOKIEJAR中的cookie),这非常简单。

首先是一个例子(管道和行号在这里添加,不会出现在实际文件中):

01 | # Netscape HTTP Cookie File
02 | # http://curl.haxx.se/rfc/cookie_spec.html
03 | # This file was generated by libcurl! Edit at your own risk.
04 | 
05 | .google.com    TRUE    /   FALSE   1305843382  cookiename  the value
06 | .yahoo.com TRUE    /   FALSE   1305843382  another_cookie  it's value
07 |

如你所见:

  1. 我们可能会将注释行标记为#作为第一个字符。
  2. 我们可能有空行
  3. 然后,强壮的线条每个都有7个标记,用制表符(\t)分隔。 这些定义为here

    1. domain - 创建可以读取变量的AND的域。
    2. flag - 一个TRUE / FALSE值,指示给定域中的所有计算机是否都可以访问该变量。此值由浏览器自动设置,具体取决于您为域设置的值。
    3. path - 变量有效的域内路径。
    4. secure - 一个TRUE / FALSE值,指示是否需要与域进行安全连接才能访问该变量。
    5. 到期 - 变量将过期的UNIX时间。 UNIX时间定义为自1970年1月1日00:00:00 GMT以来的秒数。
    6. name - 变量的名称。
    7. value - 变量的值。
    8. 所以,现在让我们制作我们的cookie文件解析器。

      // read the file
      $lines = file('path/to/cookies.txt');
      
      // var to hold output
      $trows = '';
      
      // iterate over lines
      foreach($lines as $line) {
      
        // we only care for valid cookie def lines
        if($line[0] != '#' && substr_count($line, "\t") == 6) {
      
          // get tokens in an array
          $tokens = explode("\t", $line);
      
          // trim the tokens
          $tokens = array_map('trim', $tokens);
      
          // let's convert the expiration to something readable
          $tokens[4] = date('Y-m-d h:i:s', $tokens[4]);
      
          // we can do different things with the tokens, here we build a table row
          $trows .= '<tr></td>' . implode('</td><td>', $tokens) . '</td></tr>' . PHP_EOL;
      
          // another option, make arrays to do things with later,
          // we'd have to define the arrays beforehand to use this
          // $domains[] = $tokens[0];
          // flags[] = $tokens[1];
          // and so on, and so forth
      
        }
      
      }
      
      // complete table and send output
      // not very useful as it is almost like the original data, but then ...
      echo '<table>'.PHP_EOL.'<tbody>'.PHP_EOL.$trows.'</tbody>'.PHP_EOL.'</table>';
      

      最后,here是一个演示。

答案 1 :(得分:8)

我找不到代码来满足现在非常流行的 HttpOnly Cookie记录 - 例如http://www.google.com/中使用的。 HttpOnly cookie只能由浏览器读取,并且对所有客户端脚本(如java脚本)保持隐藏状态。您可以找到有关HttpOnly cookies here的更多详细信息。

忽略Netscape cookie文件中这些cookie的格式将导致解析不正确。这些记录以&#34; #HttpOnly _&#34;为前缀。字符串。

我们也应该&#34; urldecode&#34;几乎所有应用程序的参数名称及其值。

以下函数是Majid FouladpourPhilip Norton的示例代码的组合和更新版本,它们会考虑HttpOnly cookie并将所有Cookie及其属性返回到数组中:

/**
 * Extract any cookies found from the cookie file. This function expects to get
 * a string containing the contents of the cookie file which it will then
 * attempt to extract and return any cookies found within.
 *
 * @param string $string The contents of the cookie file.
 * 
 * @return array The array of cookies as extracted from the string.
 *
 */
function extractCookies($string) {

    $lines = explode(PHP_EOL, $string);

    foreach ($lines as $line) {

        $cookie = array();

        // detect httponly cookies and remove #HttpOnly prefix
        if (substr($line, 0, 10) == '#HttpOnly_') {
            $line = substr($line, 10);
            $cookie['httponly'] = true;
        } else {
            $cookie['httponly'] = false;
        } 

        // we only care for valid cookie def lines
        if( strlen( $line ) > 0 && $line[0] != '#' && substr_count($line, "\t") == 6) {

            // get tokens in an array
            $tokens = explode("\t", $line);

            // trim the tokens
            $tokens = array_map('trim', $tokens);

            // Extract the data
            $cookie['domain'] = $tokens[0]; // The domain that created AND can read the variable.
            $cookie['flag'] = $tokens[1];   // A TRUE/FALSE value indicating if all machines within a given domain can access the variable. 
            $cookie['path'] = $tokens[2];   // The path within the domain that the variable is valid for.
            $cookie['secure'] = $tokens[3]; // A TRUE/FALSE value indicating if a secure connection with the domain is needed to access the variable.

            $cookie['expiration-epoch'] = $tokens[4];  // The UNIX time that the variable will expire on.   
            $cookie['name'] = urldecode($tokens[5]);   // The name of the variable.
            $cookie['value'] = urldecode($tokens[6]);  // The value of the variable.

            // Convert date to a readable format
            $cookie['expiration'] = date('Y-m-d h:i:s', $tokens[4]);

            // Record the cookie.
            $cookies[] = $cookie;
        }
    }

    return $cookies;
}

这是函数的demonstration

答案 2 :(得分:0)

我认为$ _COOKIE就是您所寻找的。

这个超全球可以用来读取cookie数据...设置你需要使用setcookie()更多可以在PHP网站$_COOKIE superglobal下找到

答案 3 :(得分:0)

我不确定我是否理解正确,因为通常非常简单地设置(使用setcookie)并从脚本中读取PHP中的cookie:

$value = $_COOKIE['mycookie'];

如果您正在寻找一种直接从文件系统读取原始cookie的方法,而无需通过浏览器,则需要指定它们所写的格式/浏览器。这些值可以从很多位置序列化不同语言和文件的最终结果可能因浏览器而异。

//编辑:

有关浏览器差异的更多信息:例如,Mozilla有一个format like that和一些IE more like that

答案 4 :(得分:0)

快速显示方式:

 cat sess_qe3qq1164dnggru0m1j7fpbr23 | tr ';' '\n'

答案 5 :(得分:0)

此库允许您操作(添加,删除,更新,...)Netscape Cookie文件(例如CURL生成的Cookie):

https://github.com/kegi/netscape-cookie-file-handler

P.S。这个项目很棒,但我不知道为什么在这一刻,它的星星如此之低! ; - )

答案 6 :(得分:-2)

如果您在PHP中使用会话,并且实际上是在尝试解析磁盘上的会话数据,则可以对该文件的内容使用unserialize()函数。