Есть ли какие-либо вспомогательные библиотеки для чтения файла cookie в php. У меня есть файл 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 |
Как вы видете:
- У нас могут быть строки комментариев, обозначенные
#
как первый символ. - У нас могут быть пустые строки
И затем, каждая из жирных линий имеет 7 жетонов, разделенных символом табуляции (\t
). Они определены здесь:
- домен - домен, который создал И, который может читать переменную.
- флаг - значение ИСТИНА/ЛОЖЬ, указывающее, могут ли все машины в данном домене иметь доступ к переменной. Это значение устанавливается браузером автоматически в зависимости от значения, установленного для домена.
- путь - путь в домене, для которого допустима переменная.
- secure - значение TRUE/FALSE, указывающее, требуется ли для доступа к переменной безопасное соединение с доменом.
- expiration - время UNIX, когда истекает срок действия переменной. Время UNIX определяется как количество секунд с 1 января 1970 года 00:00:00 по Гринвичу.
- name - имя переменной.
- значение - значение переменной.
Итак, теперь давайте сделаем наш парсер 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()
для содержимого этого файла.