Защита идентификатора сессии
В данной статье я постараюсь изложить все известные мне способы защиты идентификатора сессии. В предыдущих статьях о безопасности сессий в PHP были указаны методы угона сессии и ее защиты. Поэтому далее механизмы взлома будут опущены, и приведены только практические примеры обеспечения защиты php сессии.
Использование cookie
По умолчанию вся информация о сессии, включая ID, передается в cookie. Но так бывает не всегда. Некоторые пользователи отключают cookie в своих браузерах. В таком случае браузер будет передавать идентификатор сессии в URL.
http://www.example.org/index.php?PHPSESSID=n2cnj59d7s3p30fjs0jfn28nf
Здесь ID передается в открытом виде, в отличие от сессии через cookie, когда информация скрыта в HTTP-заголовке. Самым простым способом защиты от этого будет запрет передачи идентификатора php сессии через адресную строку. Сделать это можно, прописав следующее в конфигурационном файле Apache-сервера .htaccess:
php_flag session.use_only_cookies on
Использование шифрования
Если на вашем сайте должна обрабатываться конфиденциальная информация, такая как номера кредитных карт (привет от Sony), следует использовать SSL3.0 или TSL1.0 шифрование. Для этого при установке cookie следует указывать true для параметра secure.
Если вы храните пароль сессии в переменной $_SESSION (все-таки лучше использовать sql), то не стоит хранить его в открытом виде.
<?php if ($_SESSION['password'] == $userpass) { // код } ?>
Приведенный выше код не безопасный, так как пароль хранится в виде обычного текста в переменной php сессии. Вместо этого используйте md5-шифрование, примерно так:
<?php if ($_SESSION['md5password'] == md5($userpass)) { // код } ?>
Проверка браузера
Чтобы отсечь возможность использования сессии с другого браузера (компьютера), следует ввести проверку поля HTTP-заголовка user-agent:
<?php session_start(); if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { // код } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); } ?>
Срок действия сессии
Ограничьте время жизни php сессии, а также время действия cookie. По умолчанию срок действия сессии 1440 секунд. Изменить это значение можно через php.ini и .htaccess. Пример для .htaccess:
# Время жизни сессии в секундах
php_value session.gc_maxlifetime 3600
# Время жизни куки в секундах
php_value session.cookie_lifetime 3600
Привязка по IP-адресу
В определенных ситуациях (не всегда) следует установить привязку по IP-адресу. В основном когда количество пользователей ограничено и имеют статичные IP. Проверка может быть либо по списку разрешенных IP-адресов,
<?php include ("ip_list.php"); //$ip_white_list = array ( 'admin1' => '111.222.333.444', 'admin2' => '555.666.777.888'); if(!empty(array_search($_SERVER['REMOTE_ADDR'],$ip_white_list))) { header("Location: admin.php"); } else { echo 'ACCESS DENY!'; } ?>
либо по IP-адресу для каждого запроса (только для статичных IP):
<?php if(isset($_SESSION['ip']) and $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) { header("Location: admin.php"); } else { session_unset(); $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; } ?>
Следует осознавать, что полностью избежать взлома невозможно. Можно только максимально усложнить этот взлом любыми известными способами. Однако следует также не забывать о своих легальных пользователях, чтобы не осложнить им жизнь такой защитой. Во всем необходим баланс.
Для обеспечения безопасности дома или офиса рекомендую IP видеокамеры. Они обладают большим расширением картинки, в отличие от аналоговых, а также позволяют получить к ним доступ по сети Интернет и в режиме реального времени следить за объектом.