2012-03-04 3 views
0

Итак, у меня есть несколько разных способов, чтобы попытаться предотвратить захват сеанса, один использует HTTP_USER_AGENT и определяет, изменилось ли оно во время сеанса. Проблема с этим, если пользователь переходит на сайт на мобильном телефоне, а также изменения с мобильного зрения на вид рабочего стола, изменения пользовательского агента и пользователь получает следующее сообщение об ошибке:Безопасность захвата сеанса

if (isset($_SESSION['HTTP_USER_AGENT'])) 
{ 
    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) 
    { 
     echo "Error: security issue #1 (Please use contact us if recieving this error)"; 
     exit; 
    } 
} 
else 
{ 
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); 
} 

Теперь я все еще хочу этот небольшой уровень безопасности, но я не хочу, чтобы появилось сообщение об ошибке, и я хочу, чтобы сайт оставался видимым для пользователя. Как мне это сделать?

+0

Почему бы не использовать SSL? – 01100110

+1

«Я хочу продолжать проверять соответствие User Agent, но иногда я хочу, чтобы все было в порядке, если пользовательский агент не соответствует». - Вы уверены, что эта проверка действительно полезна для вас? – Amber

+1

Проверка агента пользователя добавляет абсолютно * ничего * к безопасности. Если вы исправите свой код, чтобы вообще не включать захват сеанса, вы можете просто удалить эту проверку и обеспечить пользователям лучший опыт. Если вы этого не сделаете, вы в любом случае ввернуты (и хакеры из России смогут заглянуть на ваш сайт :) –

ответ

1

Пользователь должен будет повторно аутентифицироваться при переключении устройства (вместо того, чтобы вызывать ошибку), тогда вы можете использовать как проверенные переменные $_SESSION['HTTP_USER_AGENT'] для сравнения с будущими запросами.

1

Чтобы захватить сеанс, вам необходимо знать его идентификатор. Вы делаете это либо путем угадывания допустимого идентификатора сеанса, либо путем его получения либо от клиента, либо от сервера.

Первое довольно легко смягчить: чем больше энтропия, тем лучше. Но последний не может быть смягчены только с одной мерой, как идентификатор сеанса может быть открытыми/полученными по нескольким направлениям:

  • подслушивания связи между клиентом и сервером
  • просочился при передаче через URL (HTTP реферер, файлы журналов и т.д.)
  • Cross-Site Scripting (XSS)

Некоторые из них могут быть исправлены достаточно легко: подслушивание можно избежать, используя безопасный канал (т.е. HTTPS) и утечки через URL можно избежать передача идентификатора сеанса в файл cookie (с обоими HttpOnly и Безопасный флаг). Предотвращение XSS является самым сложным, поскольку вы должны заботиться о каждом исходном исходном состоянии пользователя, прежде чем возвращать его клиенту.

Но если вы сделаете это, вы достаточно хорошо защищены от захвата сеанса. По крайней мере, часть, которую вы можете контролировать как злоумышленник, может получить файл cookie непосредственно из кукашки cookie браузера. Но это далеко не так.

0

Помещение за вопросом отражает недоразумение.

Пользовательский агент не является эффективным способом предотвращения захвата сеанса. Любой злоумышленник, достойный их соли, может тривиально обманывать их User-agent, чтобы он соответствовал тому, что был у захваченного пользователя. Эта защита в лучшем случае защищена через неясность.

Правильный способ предотвращения захвата сеанса - использовать надлежащие методы обеспечения безопасности, такие как безопасное управление сеансом, SSL на всей территории, защита CSRF, правильная проверка ввода и выходное экранирование, предотвращение XSS и т. П. OWASP обладает отличными ресурсами для обеспечения безопасности веб-приложений.

Смежные вопросы