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