$ _SESSION ['user_id'] достаточно для проверки входа в PHP? - PullRequest
5 голосов
/ 29 июня 2011

Когда пользователь заходит на веб-сайт, я сохраняю user_id в SESSION, чтобы позже проверить, вошел ли пользователь в систему или нет.

if(!empty($_SESSION['user_id'])){
  ....

Этого достаточно для безопасности?

Ответы [ 6 ]

12 голосов
/ 29 июня 2011

Это будет полностью зависеть от того, как эта переменная попадает в сеанс и насколько хорошо вы управляете сеансом.

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

Если у вас относительно короткий тайм-аут сеанса и вы уверены, что управляете тем, что превращает его в $ _SESSION ['user_id'], тогда это разумный подход,Может быть, лучше на самом деле проверить ЗНАЧЕНИЕ того, что находится в $ _SESSION ['user_id'], но это не будет большим улучшением по сравнению с тем, что у вас есть в настоящее время.

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

7 голосов
/ 29 июня 2011

Значение можно изменить, только если у кого-то есть доступ к файлам сеанса.

Так обычно да .

Но я бы предпочел использовать isset():

function loggedIn()
{
  if (isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']))
    return true;
  return false;
}

Потому что, если идентификатор пользователя равен 0, empty() также вернет true!

1 голос
/ 29 июня 2011

Если вы находитесь в среде общего хостинга, кто-то другой на том же сервере может потенциально создать действительный сеанс и получить доступ.

Или кто-то может прослушивать сетевой трафик, когда один из ваших пользователей посещает сайт.и может перехватить файл cookie и получить доступ к их учетной записи, поскольку вы просто используете простую аутентификацию на основе сеансов.

Распространенный способ решения этой проблемы - создать таблицу базы данных, возможно, называемую «сеансами», и записать сеанс.id, IP-адрес и любые другие специфичные для пользователя данные, которые вы хотите собрать при первом входе пользователя в систему. Затем вы можете многократно проверять эту таблицу сеансов, чтобы убедиться, что это действительно исходный пользователь, вошедший в систему, а не кто-то другой.

0 голосов
/ 29 июня 2011

Использовать

if(!isset($_SESSION($user_id){

Поскольку, если $ user_id == 0, isempty () не будет работать, и убедитесь, что сеанс, который не требуется на другой странице, должен быть сброшен после окончания страницы длялучшая безопасностьДля сброса определенной переменной сеанса используется метод

unset($_session_variable_name);

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

Спасибо

0 голосов
/ 29 июня 2011

Не совсем, кроме вышеприведенных комментариев, вам следует дополнительно проверить свойства, такие как IP-адрес или USER_AGENT, чтобы избежать перехвата сеанса.

0 голосов
/ 29 июня 2011

Это зависит ...

, если вы никогда не делаете что-то вроде $ _SESSION ['user_id'] = $ _GET ['user_id'], вы обычно можете сказать: это сохранение.НО есть такие вещи, как перехват сеансов, межсайтовый скриптинг, подделка межсайтовых запросов и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...