У меня есть сайт, на котором я создаю систему входа для …
В приведенном ниже коде была отправлена форма с «именем пользователя» и «паролем». Также доступна функция «remember_me» (код еще не проверен):
else if($row['password']===$pass){ session_start(); $_SESSION['logged_in'] = '1'; $remember_me = isset($_POST['remember']) ? $_POST['remember'] : '0'; if($remember_me=='1'){ $text = "SECRET_TEXT_AND_NUMBERS_HERE"; $username= $row['username']; $salt1 = sha1($row['alt_username']); $salt2 = sha1($text); $cookie_value = $salt1.':'.$username.':'.sha1($row['alt_username'].$salt2.$salt1); setcookie("s_b", $cookie_value, time()+60*60*24*100, "/"); } }
Теперь, этот код является хорошим началом для страницы входа?
Кроме того, важный вопрос о последующих действиях ко всему этому, если пользователи хотят войти в систему, я должен установить переменную $_SESSION
как в коде, и просто проверить, установлено ли это в начале всех страниц на сайт?
if(isset($_SESSION['logged_in'])) // Then user is logged in already
или я проверяю, установлен ли файл cookie, созданный на странице входа, вместо проверки сеанса?
вход в систему – это безопасность; безопасность всегда сложнее, чем кажется.
Есть несколько вещей, которые вы могли бы улучшить в своем коде. первый:
безопасность вашего пароля находится в силе алгоритма hasing. Вы выбираете использовать sha1
(лучше, чем md5, но его можно улучшить с помощью sha256 или bCrypt, если вы используете PHP версию> = 5.3)
Первый
Соль, которую вы используете, должна быть случайной величиной, сохраненной вместе с хешированным результатом. другими словами, значение для хранения в вашей базе данных:
$salt = [some random string of predifend lenght]; // Let's say 16 characters in length $storedValue = $salt . sha256($salt . $password);
вы проверяете пароль:
if ($row['username'] == $_POST['username'] && substr($row['$storedValue'], 16) == sha256(substr($row['$storedValue'], 0, 16) . $_POST['password'])) { // login ok } else { // login fail }
(еще лучше)
Используйте проверенную библиотеку для хэширования паролей, взгляните на: Переносимость хэширования PHP-паролей и попытайтесь использовать алгоритм CRYPT_BLOWFISH, если это вообще возможно.
второй
Вы должны хранить только ключ сеанса в cookie сеанса. вся другая информация хранится на сервере.
Файл cookie сеанса уже отправляется вызовом функции session_start () PHP, поэтому вам больше не нужно беспокоиться об этом.
если вы хотите проверить продолжительность жизни сеансов, вы должны сохранить эту информацию в массиве сеансов:
$_SESSION['lastActivity'] = time()+60*60*24*100;
В третьих
Помните, что токен является «эквивалентом паролей», поэтому вы должны хранить хеш маркера в своей базе данных, просто рассматривайте его как пароль, только этот «пароль» не вводится пользователем, а читается из файла cookie.
Весь смысл хэша заключается в том, что он не обратим, поэтому он не добавляет никакой ценности так, как вы использовали для функции «запомнить меня». Прекратите притворяться, что он делает что-нибудь полезное, и используйте случайный токен для запоминания меня (и зарегистрируйте его в базе данных против имени пользователя), а затем, если вы получите клиента, представляющего куки-файл, который я помню, без аутентифицированного сеанса, вы знаете, где искать узнайте, кто это.
(это также позволяет применять разумный подход, когда пользователь продолжает перемещаться на разные машины – вы можете сказать, что сохраните последние 2 значения – и отметьте, когда они попытаются запомнить меня с третьей машины).
100-дневный тайм-аут довольно длинный – может быть, 30 дней (с автоматическим обновлением может быть более уместным в зависимости от уровня риска.