Технология динамических веб-страниц PHP-анализ файлов cookie и сеансов
Автор:Eve Cole
Время обновления:2009-06-06 18:16:01
1. PHP-КУКИ
Файл cookie — это механизм, который сохраняет данные в удаленном браузере для отслеживания и идентификации пользователей.
PHP отправляет файлы cookie в заголовке протокола http, поэтому функцию setcookie() необходимо вызывать до того, как другая информация будет выведена в браузер, что аналогично ограничению функции header().
1.1 Установите файлы cookie:
Файлы cookie можно установить с помощью функций setcookie() или setrawcookie(). Его также можно установить, отправив заголовки http непосредственно клиенту.
1.1.1 Используйте функцию setcookie() для установки файлов cookie:
bool setcookie (имя строки [, значение строки [, int expire [, путь к строке [, домен строки [, bool secure [, bool httponly]]]]]])
name: имя переменной cookie
значение: значение переменной cookie
expire: время окончания срока действия,
путь: действительный каталог,
Домен: действительное доменное имя, уникальный домен верхнего уровня.
безопасный: если значение равно 1, файл cookie действителен только для соединений https; если значение по умолчанию равно 0, действительны как http, так и https.
пример:
<?php
$value = 'что-то откуда-то';
setcookie("TestCookie", $value); /* Простые настройки файлов cookie*/
setcookie("TestCookie", $value, time()+3600 /* Срок действия — 1 час*/);
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", ".example.com", 1); /* Действительный каталог/~rasmus, допустимое доменное имя example.com и все его поддомены */
?>
Установите несколько переменных cookie: setcookie('var[a]','value'); Используйте массив для представления переменной, но ее нижний индекс не требует кавычек. Таким образом, вы можете использовать $_COOKIE['var'][. 'a'] для чтения переменной COOKIE.
1.1.2. Используйте header() для установки файлов cookie;
header("Set-Cookie: name=$value[;path=$path[;domain=xxx.com[;...]]");
Следующие параметры аналогичны перечисленным выше для функции setcookie.
например:
$value = 'что-то откуда-то';
header("Set-Cookie:name=$value");
1.2 Чтение файлов cookie:
Вы можете напрямую использовать встроенную суперглобальную переменную PHP $_COOKIE для чтения файлов cookie на стороне браузера.
В приведенном выше примере установлен файл cookie «TestCookie». Теперь давайте его прочитаем:
напечатайте $_COOKIE['TestCookie'];
Файл COOKIE был экспортирован?!
1.3 Удалить файлы cookie
Просто установите допустимое время меньше текущего времени и установите пустое значение. Например:
setcookie("имя","",time()-1);
Аналогично использованию header().
1.4 Решение распространенных проблем:
1) При использовании setcookie() появляется сообщение об ошибке. Возможно, перед вызовом setcookie() имеются выходные данные или пробелы. Также возможно, что ваш документ преобразован из других наборов символов, и документ может иметь подпись спецификации. в конце (то есть добавив в содержимое файла некоторые скрытые символы спецификации). Решение состоит в том, чтобы предотвратить возникновение этой ситуации в вашем документе. Вы также можете немного справиться с этим, используя функцию ob_start().
2) На $_COOKIE влияет Magic_quotes_gpc и его можно автоматически экранировать.
3) При использовании необходимо проверить, поддерживает ли пользователь файлы cookie.
<!--[if !supportLineBreakNewLine]-->
1.5 Механизм работы файлов cookie:
Некоторые ученики более импульсивны, и у них нет времени на изучение принципов, поэтому я напишу об этом позже.
а) Сервер устанавливает файл cookie в клиенте, отправляя заголовок http Set-Cookie с ответом (для нескольких файлов cookie требуется несколько заголовков).
б) Клиент автоматически отправляет заголовок файла cookie http на сервер, а сервер получает и читает его.
HTTP/1.x 200 ОК
X-Powered-By: PHP/5.2.1
Set-Cookie: TestCookie=что-то откуда-то =/
Истекает: четверг, 19 ноября 2007 г., 18:52:00 GMT.
Управление кэшем: без сохранения, без кэширования, обязательная повторная проверка, пост-проверка = 0, предварительная проверка = 0.
Прагма: без кэша
Тип контента: текст/html
Эта строка реализует функцию cookie после получения этой строки.
Set-Cookie: TestCookie=что-то откуда-то =/
Браузер создаст файл cookie на диске клиента и напишет:
TestCookie=что-то откуда-то;
/
Эта строка является результатом использования setcookie('TestCookie','что-то откуда-то','/');. Это также результат использования заголовка('Set-Cookie: TestCookie=что-то откуда-то; путь=/') ;.
<!--[конец]-->
2. PHP-сессия
Сеанс использует файл cookie со сроком действия, равным 0, и использует уникальный идентификатор, называемый идентификатором сеанса (длинная строка), для синхронизации некоторых файлов сеанса на стороне сервера (вы можете определить тип хранилища сеанса самостоятельно) и связи с Подключенный пользователь. Веб-приложение сохраняет данные, связанные с этими сеансами, и позволяет передавать данные между страницами пользователя.
Посетителям сайта присваивается уникальный идентификатор, так называемый идентификатор сеанса. Он либо сохраняется в файле cookie на стороне клиента, либо передается через URL-адрес.
Поддержка сеансов позволяет пользователям регистрировать любое количество переменных и резервировать их для каждого запроса. Когда посетитель заходит на веб-сайт, PHP проверяет, был ли отправлен определенный идентификатор сеанса в запросе, либо автоматически (если для session.auto_start установлено значение 1), либо когда пользователь запрашивает его (явно вызывается с помощью session_start() или неявно с помощью session_register( )). Если да, то ранее сохраненная среда создается заново.
2.1 Передача идентификатора сеанса
2.1.1 Передача идентификатора сеанса через файл cookie
Используйте session_start() для вызова сеанса. При создании файла сеанса сервер генерирует хэш-значение идентификатора сеанса и имя сеанса со значением по умолчанию PHPSESSID и отправляет переменную клиенту (по умолчанию) PHPSESSID (имя сеанса). ), со значением — это 128-битное значение хеш-функции. Сервер будет взаимодействовать с клиентом через этот файл cookie.
Значение переменной сеанса сериализуется внутри PHP и сохраняется в текстовом файле на сервере и взаимодействует с клиентским кули, имя переменной которого по умолчанию — PHPSESSID.
То есть сервер автоматически отправляет http-заголовок: header('Set-Cookie: session_name()=session_id(); path=/');
То есть setcookie(session_name(),session_id());
При переходе на новую страницу с этой страницы и вызове session_start() PHP проверит сохраненные на стороне сервера данные сеанса, связанные с данным идентификатором. Если они не найдены, будет создан новый набор данных.
2.1.2 Передача идентификатора сеанса через URL-адрес
Этот метод используется только в том случае, если пользователь запрещает использование файлов cookie, поскольку файлы cookie браузера уже универсальны, и по соображениям безопасности этот метод не требуется.
<a href="p.php?<?php print session_name() ?>=<?php print session_id() ?>">xxx</a> значение сеанса также можно передать через POST.
2.2 Основные примеры использования сеанса
<?php
// страница1.php
сеанс_start();
echo 'Добро пожаловать на страницу №1';
/* Создаем переменные сеанса и присваиваем значения переменным сеанса */
$_SESSION['favcolor'] = 'зеленый';
$_SESSION['животное'] = 'кот';
$_SESSION['время'] = время();
// Если клиент использует файлы cookie, сеанс можно передать непосредственно на страницу page2.php
echo '<br /><a href="page2.php">страница 2</a>';
// Если клиент отключает куки
echo '<br /><a href="page2.php?' . SID . '">страница 2</a>';
/*
По умолчанию в php5.2.1 SID будет иметь значение только при записи файла cookie.
Соответствующий файл cookie уже существует, тогда SID будет (неопределенным) пустым.
*/
?>
<?php
// страница2.php
сеанс_start();
print $_SESSION['animal'] // Распечатываем один сеанс
var_dump($_SESSION // Распечатываем значение сеанса, переданное page1.php);
?>
2.3 Используйте функцию сеанса для управления кэшированием страниц.
Во многих случаях нам необходимо определить, кэшируется ли наша веб-страница на клиенте, или установить время действия кэша. Например, на нашей веб-странице есть конфиденциальный контент, и вам необходимо войти в систему, чтобы просмотреть его, если он кэширован локально. , вы можете напрямую открыть локальный кэш. Вы можете просматривать веб-страницы без входа в систему.
Используйте session_cache_limiter('private'); для управления кешем клиента страницы, который должен быть вызван перед session_start().
Дополнительные параметры см. в разделе Управление кэшем клиента по адресу http://blog.chinaunix.net/u/27731/showart.php?id=258087 .
Чтобы контролировать время кэширования клиента, используйте session_cache_expire(int); unit (s); Его также необходимо вызывать перед session_start().
Это всего лишь метод управления кешированием при использовании сеанса. Мы также можем управлять кешированием страницы в header().
2.4 Удалить сеанс
Для достижения нужно сделать три шага.
<?php
session_destroy(); // Первый шаг: удалите файл сеанса на стороне сервера, для этого используется
setcookie(session_name(),'',time()-3600 // Шаг 2: Удалить текущий сеанс:
$_SESSION = array(); // Шаг 3: Удалите массив глобальных переменных $_SESSION
?>
2.5 Использование сеанса в крупномасштабных веб-приложениях PHP Для сайтов с большим количеством посещений метод хранения сеанса по умолчанию не подходит. На данный момент лучшим методом является использование базы данных для доступа к сеансу. функция bool session_set_save_handler (открытие обратного вызова, закрытие обратного вызова, чтение обратного вызова, запись обратного вызова, уничтожение обратного вызова, обратный вызов gc) — это решения, предоставленные нам для решения этой проблемы.
Эта функция использует следующие 6 функций:
1. bool open() используется для открытия механизма хранения сеанса,
2. bool close() закрывает операцию сохранения сеанса.
3. mixde read() Используйте эту функцию при загрузке данных сеанса из хранилища.
4. bool write() записывает все данные данного идентификатора сеанса в хранилище.
5. bool Destroy() уничтожает данные, связанные с указанным идентификатором сеанса.
6. bool gc() Пример сбора мусора данных в системе хранения см. в функции session_set_save_handler() в руководстве по PHP.
Если вы используете классы для этого, используйте
session_set_save_handler(
массив («Имя класса», «открыть»),
массив («Имя класса», «закрыть»),
массив («Имя класса», «прочитано»),
массив («Имя класса», «запись»),
массив («имя класса», «уничтожить»),
массив («Имя класса», «gc»),
)
Вызов 6 статических методов в классе className можно изменить на объект, поэтому нет необходимости вызывать статические методы. Однако использование статических членов не требует создания объекта, а производительность повышается.
2.6 Часто используемые функции сеанса:
bool session_start (недействительный); инициализировать сеанс
bool session_destroy(void): Удалить файлы, связанные с сеансом на стороне сервера.
строка session_id() идентификатор текущего сеанса
string session_name() Имя сеанса, к которому в данный момент осуществляется доступ, которое представляет собой имя файла cookie, в котором клиент сохраняет идентификатор сеанса. По умолчанию используется PHPSESSID.
array session_get_cookie_params() Детали сеанса, связанные с этим сеансом.
строка session_cache_limiter() управляет клиентским кешем страниц, использующих сеанс
ini session_cache_expire() управляет временем кэширования клиента
bool session_destroy() удаляет файл, в котором сохраняется информация о сеансе, на стороне сервера.
void session_set_cookie_params ( int life [, строковый путь [, строковый домен [, bool secure [, bool httponly]]]]) Устанавливает сведения о сеансе, связанные с этим сеансом.
bool session_set_save_handler (открытие обратного вызова, закрытие обратного вызова, чтение обратного вызова, запись обратного вызова, уничтожение обратного вызова, обратный вызов gc) определяет функцию для обработки сеанса (не используя метод по умолчанию)
bool session_regenerate_id([bool delete_old_session]) назначает новый идентификатор сеанса
2.7 Проблемы безопасности сеанса Злоумышленники прикладывают много усилий, пытаясь получить эффективный идентификатор сеанса существующего пользователя. Благодаря идентификатору сеанса они могут иметь те же возможности, что и этот пользователь в системе.
Поэтому наше основное решение — проверить достоверность идентификатора сеанса.
<?php
if(!isset($_SESSION['user_agent'])){
$_SESSION['user_agent'] = $_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'];
}
/* Если идентификатор пользовательской сессии подделан*/
elseif ($_SESSION['user_agent'] != $_SERVER['REMOTE_ADDR']. $_SERVER['HTTP_USER_AGENT']) {
session_regenerate_id();