Правда о сессиях
Страница 6. Выдача себя за другого. Часть 2



Листинг 3


<?php
    session_start
();
    if (
md5($_SERVER['HTTP_USER_AGENT']) != $_SESSION['HTTP_USER_AGENT'] ) {
        
/* Запрос пароля */
        
exit;

    }
    
/* Остальной код */
?>

Конечно, перед этим вам необходимо сохранять MD5-хэш от полного
названия браузера пользователя всякий раз, когда вы впервые начинаете
сессию, как показано в листинге 4.


Листинг 4


<?php
    session_start
();
    
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);

?>

Хотя и не обязательно, чтобы вы использовали MD5-хэш вместо полного
названия браузера пользователя, это поможет обеспечить определённое
постоянство и исключить необходимость проверки правильности значения $_SERVER['HTTP_USER_AGENT']
перед сохранением его в сессии. Так как данные эти берутся от клиента,
доверять им вслепую нельзя, но формат MD5-хэша независим от входных
данных.

Теперь, когда мы добавили проверку браузера пользователя,
атакующий должен осуществить два шага для того, чтобы подделать сессию:

  • Получить правильный идентификатор сессии.
  • Предоставить при ВСД-атаке такой же заголовок User-Agent.

Хоть это, несомненно, и возможно, по крайней мере, это сложнее, чем,
если бы второй шаг был пропущен. Таким образом, мы уже несколько
усилили безопасность сессионного механизма.

Другие заголовки могут быть добавлены таким же путём, и вы
можете даже использовать в качестве "отпечатков пальцев" комбинацию
заголовков. Если вы также добавите некий дополнительный секретный
префикс, то такие "отпечатки" становится практически невозможно
угадать. Посмотрите пример на листинге 5.


Листинг 5


<?php
    session_start
();
    
$fingerprint = 'SECRETSTUFF' . $_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_CHARSET'];

    
$_SESSION['fingerprint'] = md5($fingerprint . session_id());
?>

Заголовок Accept не должен использоваться в "отпечатках
пальцев", так как Microsoft'овский Internet Explorer известен
расхождением в значениях этого заголовка в случаях, когда пользователь
обновляет страницу и когда он кликает по ссылке.

С трудно угадываемыми "отпечатками пальцев" некоторый выигрыш
достигается и без усложнения этой информации иным, чем
демонстрировалось до сих пор, способом. При существующем механизме для
ВСД по сути требуются те же два шага, хотя второй шаг теперь гораздо
сложнее, так как атакующий должен воспроизвести множественные
заголовки.

Для увеличения безопасности необходимо начать включать данные в
дополнение к уникальному идентификатору. Рассмотрим механизм управления
сессией, при котором уникальный идентификатор передаётся в GET-данных.
Если "отпечатки пальцев", сгенерированные в предыдущем примере, также
передаются как GET-данные, атакующий должен осуществить следующие три
шага для успешной подделки сессии:

  • Получить правильный идентификатор сессии.
  • Предоставить те же HTTP-заголовки.
  • Предоставить правильные "отпечатки пальцев".

Если и уникальный идентификатор, и "отпечатки пальцев" передаются
как GET-данные, то, возможно, что атакующий, который сможет получить
что-то одно из них, также получит доступ и к другому. Более безопасным
подходом является использование двух различных методов передачи —
GET-данных и кук. Конечно, это зависит от пользовательских настроек, но
для тех, кто разрешил куки, может быть обеспечен дополнительный уровень
защиты. Таким образом, если атакующий получит уникальный идентификатор
через уязвимость браузера, "отпечатки пальцев", вероятно, всё ещё будут
ему неизвестны.

Есть много других способов, которые могут быть использованы,
чтобы увеличить безопасность вашего механизма управления сессией. Будем
надеяться, вы добьётесь успеха на пути создания некоторых собственных
техник. Как-никак, именно вы являетесь экспертом ваших собственных
приложений, поэтому, вооружённые хорошим пониманием сессий, вы —
самый подходящий человек для реализации дополнительной безопасности.

 
Следующая статья »