Насколько безопасны переменные сессии PHP?
У меня есть сценарий входа, который проверяет имя пользователя / пароль по данным в таблице "пользователь". Кроме того, у меня есть таблица "ролей", которая определяет уровень доступа данного пользователя. Предполагая, что я использую безопасные сценарии входа в систему, есть ли какие-либо дыры в безопасности при простом выполнении дополнительного запроса после успешного входа в систему к таблице "ролей" для определения уровня авторизации пользователя и сохранения его в переменной сеанса? Тогда идея заключается в том, что на любой странице со смешанными правами я мог бы просто запросить переменную сеанса, чтобы обнаружить уровень авторизации пользователя, вошедшего в систему.
Благодарю.
4 ответа
Сессии значительно безопаснее, чем, скажем, куки. Но все еще возможно украсть сеанс, и, таким образом, хакер будет иметь полный доступ ко всему, что находится в этом сеансе. Некоторые способы избежать этого - проверка IP (которая работает довольно хорошо, но с очень низким fi и, следовательно, сама по себе ненадежна), и использование одноразового номера. Обычно для одноразового номера у вас есть "маркер" для каждой страницы, так что каждая страница проверяет, соответствует ли одноразовый номер последней страницы тому, что было сохранено.
При любой проверке безопасности происходит потеря удобства использования. Если вы выполняете проверку IP-адресов, а пользователь находится за брандмауэром интрасети (или любой другой причиной, вызывающей это), который не имеет постоянного IP-адреса для этого пользователя, ему придется проходить повторную аутентификацию каждый раз, когда он теряет свой IP-адрес. С одноразовым номером вы получаете всегда забавную ситуацию "Нажатие приведет к разрыву этой страницы".
Но с cookie-файлом хакер может украсть сеанс, просто используя довольно простые методы XSS. Если вы сохраняете идентификатор сеанса пользователя в виде файла cookie, он также уязвим для этого. Таким образом, несмотря на то, что сеанс доступен только для тех, кто может взломать на уровне сервера (что требует гораздо более сложных методов и, как правило, некоторого количества привилегий, если ваш сервер защищен), вам все равно потребуется дополнительный уровень проверки на каждый запрос скрипта. Вы не должны использовать cookie-файлы и AJAX вместе, так как в случае кражи cookie-файлов будет немного проще отправиться в город, так как ваши запросы ajax могут не проходить проверку безопасности по каждому запросу. Например, если страница использует одноразовый номер, но страница никогда не перезагружается, сценарий может проверять только это совпадение. И если cookie-файл содержит метод аутентификации, я теперь могу отправиться в город, исполняя зло, используя украденный cookie-файл и дыру AJAX.
Только сценарии, выполняемые на вашем сервере, имеют доступ к массиву _SESSION. Если вы определите область действия куки-файла сеанса, вы даже можете ограничить его определенным каталогом. Единственный способ, чтобы кто-то кроме вас мог получить эти данные сеанса, это вставить некоторый код PHP на одну из ваших страниц.
Что касается системы, которую вы используете, это приемлемо и является хорошим способом сохранить вызовы базы данных, но имейте в виду, что это потребует от пользователя выхода из системы и повторного входа в систему для применения любых изменений авторизации. Поэтому, если вы хотите заблокировать учетную запись, и этот пользователь уже вошел в систему, вы не сможете.
Следует отметить, что в Apache суперглобальный PHP $_SESSION доступен для всех виртуальных хостов. Рассмотрим этот сценарий:
- На вашем сервере размещены два домена, example.com и instance.org. Сеансы PHP хранятся в файлах cookie, которые ограничены доменом.
- Пользователь входит в example.com и получает идентификатор сеанса. Example.com устанавливает некоторые переменные сеанса (которые хранятся на сервере, а не в cookie).
- Третья сторона перехватывает cookie во время передачи и передает его на instance.org. Instance.org теперь имеет доступ к переменным сеанса example.com.
Это не такая уж большая проблема, когда вы управляете всеми виртуальными хостами на вашем сервере, но если вы находитесь на общей машине, это проблематично.
Если для определения ролей вы используете значение, хранящееся в переменной сеанса, вы теряете возможность изменять значение в БД и отражать его в отношении текущего сеанса пользователя. Если вы посмотрите на Zend Framework, есть четкое различие между аутентификацией и авторизацией и строго сформулированными предупреждениями в руководстве, чтобы хранить только минимальный объем данных в сеансе (т. Е. "Да, он пользователь № 37 и он вошел в систему"),
Что касается "безопасности" - если вы не используете общий хост, вам не о чем беспокоиться. На правильно настроенном общем хосте они также должны быть относительно безопасными.