PHP чтение файла cookie

Есть ли какие-либо вспомогательные библиотеки для чтения файла cookie в php. У меня есть файл cookie на моем локальном диске, и мне бы хотелось, чтобы он лучше читал его. В настоящее время я просто читаю файл как по строке и разбираю значения.

Ответ 1

Это довольно просто, если вы хотите прочитать формат Netscape (например, curl сохраняет куки в COOKIEJAR в этом формате).

Сначала пример (здесь добавляются каналы и номера строк, и они не встречаются в реальном файле):

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 value
07 |

Как вы видете:

  1. У нас могут быть строки комментариев, обозначенные # как первый символ.
  2. У нас могут быть пустые строки

И затем, каждая из жирных линий имеет 7 жетонов, разделенных символом табуляции (\t). Они определены здесь:

  1. домен - домен, который создал И, который может читать переменную.
  2. флаг - значение ИСТИНА/ЛОЖЬ, указывающее, могут ли все машины в данном домене иметь доступ к переменной. Это значение устанавливается браузером автоматически в зависимости от значения, установленного для домена.
  3. путь - путь в домене, для которого допустима переменная.
  4. secure - значение TRUE/FALSE, указывающее, требуется ли для доступа к переменной безопасное соединение с доменом.
  5. expiration - время UNIX, когда истекает срок действия переменной. Время UNIX определяется как количество секунд с 1 января 1970 года 00:00:00 по Гринвичу.
  6. name - имя переменной.
  7. значение - значение переменной.

Итак, теперь давайте сделаем наш парсер 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 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>';

Наконец, вот демо.

Ответ 2

Я не смог найти код для HttpOnly файлов cookie, которые сейчас довольно популярны - например, используется в http://www.google.com/. Печенье HttpOnly ТОЛЬКО читается браузером и останется скрытым от всех клиентских скриптов, таких как java-скрипты. Вы можете найти более подробную информацию о HttpOnly cookie здесь.

Игнорирование формата этих файлов cookie в файлах cookie Netscape приведет к некорректному разбору. Эти записи имеют префикс строки "#HttpOnly_".

Мы также должны указывать имена параметров "urldecode" и их значения практически для всех приложений.

Следующая функция представляет собой комбинированную и обновленную версию примеров кода Majid Fouladpour и Philip Norton, который рассматривает файлы cookie HttpOnly и возвращает все файлы 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;
}

И это демонстрация этой функции.

Ответ 3

Я думаю, что $_COOKIE - это то, что вы ищете.

Этот суперглобал можно использовать для чтения данных cookie... для его установки вам нужно использовать setcookie() Подробнее можно найти на веб-сайте PHP под $_COOKIE superglobal

Ответ 4

Я не уверен, что правильно вас понимаю, как обычно довольно просто установить (используя setcookie) и прочитать файл cookie в PHP из ваших скриптов:

$value = $_COOKIE['mycookie'];

Если вы ищете способ чтения сырого файла cookie непосредственно из вашей файловой системы, не просматривая браузер, вам нужно указать, в каком формате/браузере они были написаны. Значения могли быть сериализованы из множества разных языков, и конечный результат файла может отличаться от браузера к браузеру.

//Редактировать:

Подробнее о различиях в браузере: например, Mozilla имеет формат, подобный этому, и IE что-то больше нравится.

Ответ 5

Быстрый способ отображения:

 cat sess_qe3qq1164dnggru0m1j7fpbr23 | tr ';' '\n'

Ответ 6

Эта библиотека позволяет вам манипулировать (добавлять, удалять, обновлять,...) файлом cookie Netscape (например, файлами cookie, генерируемыми CURL):

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

Простой пример чтения + записи куки:

/*Open and parse the cookie file*/

$configuration = (new Configuration())->setCookieDir('cookies/');
$cookieJar = (new CookieFileHandler($configuration))->parseFile('my_cookie_file');

/*Add (and save) a cookie*/

$cookieJar->add(
    (new Cookie())
        ->setHttpOnly(true)
        ->setPath('/foo')
        ->setSecure(true)
        ->setExpire(new DateTime('2020-02-20 20:20:02'))
        ->setName('foo')
        ->setValue('bar')
)->persist();

PS Этот проект великолепен, но я не знаю, почему в этот момент его звезды так низки! ;-)

Ответ 7

Если вы используете сеансы в PHP, и на самом деле вы пытаетесь разобрать данные сеанса на диске, вы можете использовать функцию unserialize() для содержимого этого файла.