Статьи ⇒ PHP ⇒ Защита идентификатора сессии

Защита идентификатора сессии

Опубликовано: 5 май 2011 в 23:20
Автор: freeeeez  

В данной статье я постараюсь изложить все известные мне способы защиты идентификатора сессии. В предыдущих статьях о безопасности сессий в 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'];
}
?>

Следует осознавать, что полностью избежать взлома невозможно. Можно только максимально усложнить этот взлом любыми известными способами. Однако следует также не забывать о своих легальных пользователях, чтобы не осложнить им жизнь такой защитой. Во всем необходим баланс.

Источник: PHP Security Consortium внешняя ссылка
Тэги:  •  •  • 
1 комментарий
8 311 просмотров


#1 Василий, 6 фев 2014 в 13:50
if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])
надо заменить на
if ($_SESSION['HTTP_USER_AGENT'] == md5($_SERVER['HTTP_USER_AGENT'])

Оставить комментарий:

Имя:
Email:
Сайт:
Комментарий:

Допустимые теги: <em> • <strong> • <u> • <sub> • <sup> • <blockquote>

Проверочный код:

Введите проверочный код, для подтверждения, что вы не робот.
P.S. Если вы робот, то, к сожалению, вы
не сможете прочитать символы с картинки.