Новое для входа и сеансов PHP; Это достаточно безопасно?

У меня есть сайт, на котором я создаю систему входа для …

В приведенном ниже коде была отправлена ​​форма с «именем пользователя» и «паролем». Также доступна функция «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, созданный на странице входа, вместо проверки сеанса?

Solutions Collecting From Web of "Новое для входа и сеансов PHP; Это достаточно безопасно?"

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

Есть несколько вещей, которые вы могли бы улучшить в своем коде. первый:

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