Я хочу знать процесс, который обычно выполняется в веб-приложениях, чтобы поддерживать логин между несколькими запросами, а также то, как они управляют вещами, используя COOKIES.
В моей форме входа я предоставляю функцию «Запомнить меня».
Когда пользователь вводит логин, я проверяю правильность имени пользователя и пароля из базы данных. Если он действителен, тогда я проверяю, выбрано ли значение «Запомнить меня», если да, затем сохраните имя пользователя и пароль в сеансе, зашифрованный формат. И, наконец, сохранить имя пользователя и пароль в SESSION.
Когда пользователь переходит от одной страницы к другой, сначала запускаю скрипт проверки входа, который проверяет, есть ли какое-либо значение в куки-файлах, а затем проверяет его имя и пароль из базы данных, чтобы проверить его достоверность. Если в cookie нет значения, и в сеансе есть какое-то значение, тогда я получаю значение сеанса dnot, проверяя его с db.
Я не проверяю значение db для сессии, чтобы не удалять db без необходимости, ускоряйте все. В случае файлов cookie они могут быть изменены, поэтому проверка необходима.
Это то, что моя концепция, правильно? Это путь, и обычно сайт slike SO, а другой работает над этим методом?
Или веб-сайты проверяют подлинность входа в систему на каждую загрузку страницы, не имеет значения в сеансе или в файлах cookie?
Пожалуйста, проверьте и дайте свои мысли и концепции для этого сценария.
Благодаря!
Во-первых, просто отслеживайте, если кто-то вошел в систему. После этого мы позаботимся о функции «запомнить меня».
Чтобы узнать, кто-то вошел в систему, вы просто посмотрите на массив $_SESSION
. Все, что там есть, потому что вы положили его туда раньше. Таким образом, при обработке формы входа в систему, если имя пользователя и пароль верны, вы сохраняете имя пользователя, идентификатор пользователя или что-то еще на сеансе ( $_SESSION['username'] = $username;
).
Всякий раз, когда пользователь загружает какую-либо страницу, вы просто проверяете
if (isset($_SESSION['username'])) { // $_SESSION['username'] is logged in } else { // nobody is logged in }
Нет необходимости хранить пароль в $_SESSION
(фактически, для целей безопасности лучше не хранить его нигде, кроме хеширования в базе данных).
Теперь функция «запомнить меня» … Во-первых, некоторые соображения:
В первом случае представьте, что в файле cookie вы сохраняете имя пользователя, которое должно быть «запомнено» (ОЧЕНЬ ИНСЕКЦИЯ!). Это означает, что если какой-либо пользователь создает cookie для вашего веб-приложения с содержимым «joe», ваше приложение будет думать, что пользовательский joe запомнится на этом компьютере, чтобы предоставить доступ к этому злоумышленнику, как если бы он / она был Джо. Итак, нам нужно как-то склеить / хэш-файл cookie.
Во втором случае, недействительный «помни меня» на некоторых компьютерах, мы будем использовать пароль в некотором роде. Если какой-либо пользователь хочет аннулировать все компьютеры, на которых он, возможно, установил флажок «запомнить меня», все, что ему нужно сделать, это изменить его пароль. Это также означает, что если он / она изменяет свой пароль, все сохраненные логины для его учетной записи будут признаны недействительными по той же самой причине. Но лучше безопасно, чем жаль …
Итак, когда вы обрабатываете логин, а имя пользователя и пароль верны, а опция «rememeber me» отмечена, помимо сохранения имени пользователя в сеансе, вы храните хэш имени пользователя и пароля (и немного соли, если вы будет) в cookie, который вы отправляете пользователю. Также вам нужно сохранить в cookie имя пользователя в виде обычного текста (или зашифрованном обратимым образом), чтобы узнать, какой пользователь пытается «войти» через cookie, и проверить хэш имени пользователя и пароля в cookie с хешем имя пользователя и пароль в базе данных. Если эта проверка верна, вы затем сохраняете имя пользователя в сеансе и больше не проверяете cookie этого пользователя (по крайней мере, для этого сеанса).
Итак, в целом ваш код может выглядеть так:
login.php
if (check_login($_POST['username'], $_POST['password'])) { // login correct $_SESSION['username'] = $_POST['username']; if (isset($_POST['remember_me'])) { // we hash the password because we **NEVER** store it in plain text anywhere // so when we would like to check if the cookie value is correct, we will not // be able to do so if the hash in the cookie was done from the plaintext // password. $value = sprintf('%s:%s', $_POST['username'], md5($_POST['username'].hash_password($_POST['password']))); setcookie('rememberme', $value); } redirect('/your/home/page.php'); // view Post/Redirect/Get design pattern } else { // login incorrect, show error message and whatever... }
в начале каждого файла php (или, лучше, во включенном файле для загрузки вашего приложения)
if (isset($_SESSION['username'])) { // $_SESSION['username'] is logged in, proceed as you wish } else if (isset($_COOKIE['rememberme'])) { // this user has checked the remember me feature some time ago in a previous login. // let's check if it is valid. list($username, $hash) = explode(':', $_COOKIE['rememberme']); // we need to get the password hash stored for this user (remember you **NEVER** store passwords in plain text $pwd_hash = obtain_password_hash_from_username($username); if ($hash == sprintf('%s:%s', $username, md5($username.$pwd_hash))) { // yeah, the user remembered is correct. We'll save it to the session to not do this shit again $_SESSION['username'] = $username; } else { // the cookie value is not correct so maybe an attacker is trying to fool us, // or the user changed his password. Whatever it is, we remove the cookie // because it's no longer valid setcookie('rememberme', '', time() - 3600); } } else { // this user is neither logged in nor "remembered" }
Метод хэш-пароля пользователя зависит от вас. Вам может понравиться простой md5 или sha, соленый md5 или sha (лучше) или какой-то трудоемкий метод, как blowfish (рекомендуется). Для хэш-файла cookie я использовал простой md5, но вы можете выбрать любой из описанных выше способов.
Я думаю, что все.