Темы, такие как Fixation / Hijacking для PHP Session, и некоторые люди, такие как Крис Шифлетт, рекомендуют проверять агент пользователя ( $_SESSION['HTTP_USER_AGENT']
), чтобы проверить проверку $_SESSION['HTTP_USER_AGENT']
сеанса. Некоторые ресурсы даже рекомендуют что-то вроде этого:
<?php $string = $_SERVER['HTTP_USER_AGENT']; $string .= 'SHIFLETT'; /* Add any other data that is consistent */ $fingerprint = md5($string); ?>
Тем не менее, Крис Снайдер говорит, что «вселенная агентов браузера минимальна по сравнению с юниверсом пользователей, поэтому каждый пользователь не может иметь индивидуальный пользовательский агент. Кроме того, нетрудно подменять пользовательский агент. поэтому для проверки этой метрики в качестве доказательства действительности сеанса мало реальности »(глава 7, стр. 103).
Очень сложно понять, что делать, если вы сталкиваетесь с противоречивыми советами, и когда некоторые из советов могут быть устаревшими (например, пример Shiflett / PHPSec выше, чья метка времени, похоже, в пятницу, 18 марта 2005 г.). Более новые рекомендации, такие как Snyder's (дата публикации: 9 декабря 2010 г.), выглядят лучше, но всегда ли так? (Например, несмотря на длительное время, рекомендуя использовать mysqli
, Snyder полностью игнорирует то, что пользователи Stack Overflow, похоже, согласны, это лучший выбор – PDO
– поэтому я не полностью продаюсь на Snyder как окончательный Trustworthy Expert).
Итак, я думаю, что мой вопрос состоит из двух частей: один конкретный (должен ли я изучать пользовательский агент?) И еще один генерал (которому следует доверять, когда дело доходит до последнего мышления в PHP Security?), доверяйте людям на переполнение стека! " – или я бы не стал спрашивать, в первую очередь, потому что толпа-поиск самых современных мышлений часто является лучшей идеей.
После полезного обсуждения в комментариях w / @Radu, чтобы уточнить вопрос HTTPS –
Снайдер, кажется, говорит две вещи: 1.) HTTPS делает другие инструменты менее необходимыми или ненужными. 2.) В ситуациях, когда нельзя использовать HTTPS, по-прежнему не очень полезно проверять агент пользователя (и, похоже, это тот момент, когда он не согласен с некоторыми, возможно, более старыми советами).
Если человек посередине может захватить идентификатор сеанса, тогда у него не должно быть абсолютно никакой проблемы при отправке одного и того же пользовательского агента, поэтому я не думаю, что это приведет вас куда угодно. Это безопасность безвестности.
Если вам нужна реальная защита, используйте HTTPS.
Пользовательский агент не является полностью безумным, но он добавляет тонкий слой поверх другой безопасности. Есть дебаты о том, что следует делать с отпечатками пальцев. Но тем не менее он добавляет принцип защиты по глубине. Вы можете установить файл cookie и использовать его в сочетании с пользовательским агентом и определенным словом для создания отпечатка пальца. Я хочу сказать, что это немного повышает безопасность!
Проблема с сеансами заключается в том, что вам просто нужен идентификатор сеанса для использования этого сеанса. Если вы знаете действительный идентификатор сеанса, вы можете использовать этот сеанс. Вот как работают сеансы.
Теперь некоторые предлагают использовать дополнительную привязку для проверки правильности использования определенного сеанса определенным клиентом. Идентификатор пользовательского агента является такой предлагаемой базой данных, поскольку он является своего рода уникальным (см. Panoptoclick для проверки вашего собственного) и не изменяется во время сеанса (в отличие от некоторых других сведений, предоставленных клиентом).
Но это лишь уменьшает вероятность фиксации сеанса и предотвращает случайное использование внешней сессии в случае захвата сеанса. Поскольку злоумышленник может попытаться получить идентификатор агента пользователя жертвы и подделать его при фиксации или захвате сеанса. И здесь не имеет значения, сохраняете ли вы идентификатор агента пользователя в обычном или в виде (соленого) хэша.
Лучше использовать уже проверенные меры защиты.