Снятие сеансов (PHP)

Я кодирую веб-сайт на PHP, содержащий логическое $_SESSION['logged_in']. Это значение равно true, когда совпадение имени пользователя и пароля присутствует в базе данных.

Я новичок в сеансах и просто задавался вопросом, возможно ли, если бы незарегистрированный (или, если на то пошло, зарегистрированный) пользователь мог обойти процесс входа в систему, установив этот логический код на true, что было бы возможно с cookie.

Я понимаю, что пользователю придется манипулировать серверной переменной с клиентской стороны, но мои вопросы в том, насколько легко это было бы, как бы пользователь мог выполнить такую ​​задачу, есть ли какие-либо известные эксплойты, и каковы наилучшие методы/превентивные меры, чтобы избежать такого рода нападений?

Ответ 1

Давайте начнем с хороших новостей: массив $_SESSION по умолчанию полностью невидим и не поддается клиенту: он существует на сервере и только на сервере, в среде выполнения, которая не открыта для клиента.

Теперь вернемся к земле: довольно легко получить ваш PHP-код "почти справа" и таким образом открыть дверь между клиентом и сеансом, как видно на сервере. В дополнение к этому, краже клиентского сеанса (включая файл cookie) довольно просто.

Я рекомендую несколько смягчений, которые оказались достаточно эффективными:

  • Не сохраняйте значение "вошедшего в систему" ​​- вместо этого сохраните значение "cookie" сеанса и установите cookie клиенту. По запросу клиента сделайте что-то в строках $loggedin=($_SESSION['cookie']==$_COOKIE['session']). Это делает злоумышленнику обоим: cookie и идентификатор сеанса.
  • Часто обновляйте cookie сеанса, в неправильном cookie файле убиваете сеанс. Если черная шляпа украдет файл cookie и сеанс, следующий щелчок реального пользователя выйдет из системы и создаст регистрируемое событие.
  • Если ваши запросы поступают из JS, подумайте о создании простой функции проверки подлинности: вместо отправки токена аутентификации, солейте его, перепишите его с отметкой времени, а затем запишите его. Отправить соль, метку времени и хэш. Сделайте проверку сервера отметкой времени.

Ответ 2

Никому, кроме вашего кода, не может управлять значениями в сеансе. Чтобы кто-то обошел это, ему пришлось бы иметь разрешение на запуск кода на сервере или использование дыры в безопасности вашего кода или сервера (в любом случае, это эксплойт безопасности). Если пользователь может это сделать, ему, вероятно, не нужно беспокоиться о том, чтобы играть с значениями сеанса, так как он может делать практически что угодно на сервере напрямую.

Ответ 3

Наиболее распространенной проблемой, встречающейся в домене сеансов, является Захват сеанса. Это связано с тем, что сеансы связаны с параметром session. Этот параметр должен предоставляться пользователем каждый раз, когда он отправляет запрос на сервер. Как вы можете себе представить, может ли кто-то угадать или получить параметр, они должны "захватить" сеанс.

Изменить: в отношении мер безопасности против него взгляните на сообщение Евгения Рекка.

Ответ 4

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