2016-01-08 2 views
2

Например, насколько безопасно было бы сделать следующее для входа пользователя в систему: (set_userdata просто устанавливает переменную $_SESSION).Насколько безопасно использовать данные для входа в сеанс PHP?

$sess_array = array(
    'id' => $row->id, 
    'username' => $row->username 
    ); 
    $this->session->set_userdata('logged_in', $sess_array); 

(от http://www.iluv2code.com/login-with-codeigniter-php.html)

А чтобы проверить, имеет ли этот массив действительный идентификатор и имя пользователя на каждой странице, чтобы убедиться, что пользователь вошел в систему? Сохраняет ли идентификатор удостоверение личности (если обычный пользователь не может найти этот идентификатор)?

+1

Я лично избегаю использования имени пользователя в сеансе, потому что можно обнюхать переменные сеанса. Если вы хотите более безопасно, вы можете создать новый случайный хеш, когда они войдут в систему, сохраните его в записи пользователя db и в сеансе, а затем сравните эту загрузку каждой страницы. Тогда у вас практически нет утечки информации, и было бы гораздо труднее подменить хороший хэш SHA1, чем угадать/подделать идентификатор и имя пользователя. –

+0

Не содержит ли codeigniter свою собственную библиотеку регистрации? Почему вы катаетесь самостоятельно? –

+0

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

ответ

1

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

Итак, вы хотите создать токен loggedIN, который затем хранится в сеансе и БД, и сравнивается, когда вызывается контент, требующий входа в систему.

Токены должны быть проиндексированы уникальными и регулярно уничтожать пользователей, которые не вошли в систему, имеют NULL. Это уменьшает временные таблицы, когда токены сравниваются при загрузке содержимого.

1

PHP сессии хранятся на сервере , значит ни один клиент не может читать/манипулировать извне (за исключением вы бы разрешить его через запрос HTTP или аналогичный): , так что вы должны быть безопасными.

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

Сохраняя ID не делаешь его более безопасным, но более удобно:

  • Нет избежать необходимости (помимо литья)
  • легче/быстрее поиск в базе данных (сравните целое поиск в строковом поиск)
  • ID: уникальный (недвусмысленный) по сравнению с именем пользователя.
+0

Спасибо за интересный ответ!Можете ли вы рассказать об этом: 'кроме того, что вы разрешили бы это через http-запрос или подобное? –

+1

Как сказано, сеансы хранятся на сервере. Но это не обязательно означает, что вы в безопасности: если вы ** допускаете ** (случайно или нет), клиент пишет или читает свои собственные сеансы, тогда у вас будет проблема. Конечно, это не произойдет, если вы обратите внимание на **, как и когда ** вы пишете сессии. – d3L

1

Невозможно захватить сеанс PHP без доступа к серверу. Однако можно сделать Timing attack с помощью файла cookie, доступного для пользователя. Поэтому я рекомендую зашифровать ваш файл cookie, чтобы сделать его более безопасным.

Установить это в application/config/config.php

$config['sess_cookie_name'] = 'ci_session'; 
$config['sess_expiration'] = 9600; 
$config['sess_encrypt_cookie'] = TRUE; 
Смежные вопросы