Intereting Posts
собираемся построить php MVC, какие соглашения об именах мне нужно знать? Множественные подсчеты в CakePHP mysql_result () ожидает, что параметр 1 будет ресурсом, boolean given Ошибка возврата API-интерфейса Twitter: 34 (404) Как поймать ошибки БД в CodeIgniter PHP Почему mcrypt_encrypt () помещает двоичные символы в конец моей строки? Создание правильного захвата изображения текущего экрана с использованием jquery или PHP или конвертировать div в pdf Второй аргумент функции copy () не может быть каталогом mysqli_stmt :: bind_result (): Число переменных привязки не соответствует количеству полей в подготовленном сообщении mongodb php получает уникальные значения полей Добавить пользовательский атрибут для создания шаблонов электронной почты – Magento Как использовать конфигурационный файл YAML в Silex Framework php imagick, как сделать область прозрачной Класс сеанса PHP Сравнение производительности PHP5, Windows и Linux

Логическая концепция и логика системы?

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

В моей форме входа я предоставляю функцию «Запомнить меня».

Когда пользователь вводит логин, я проверяю правильность имени пользователя и пароля из базы данных. Если он действителен, тогда я проверяю, выбрано ли значение «Запомнить меня», если да, затем сохраните имя пользователя и пароль в сеансе, зашифрованный формат. И, наконец, сохранить имя пользователя и пароль в SESSION.

Когда пользователь переходит от одной страницы к другой, сначала запускаю скрипт проверки входа, который проверяет, есть ли какое-либо значение в куки-файлах, а затем проверяет его имя и пароль из базы данных, чтобы проверить его достоверность. Если в cookie нет значения, и в сеансе есть какое-то значение, тогда я получаю значение сеанса dnot, проверяя его с db.

Я не проверяю значение db для сессии, чтобы не удалять db без необходимости, ускоряйте все. В случае файлов cookie они могут быть изменены, поэтому проверка необходима.

Это то, что моя концепция, правильно? Это путь, и обычно сайт slike SO, а другой работает над этим методом?

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

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

Благодаря!

Solutions Collecting From Web of "Логическая концепция и логика системы?"

Во-первых, просто отслеживайте, если кто-то вошел в систему. После этого мы позаботимся о функции «запомнить меня».

Чтобы узнать, кто-то вошел в систему, вы просто посмотрите на массив $_SESSION . Все, что там есть, потому что вы положили его туда раньше. Таким образом, при обработке формы входа в систему, если имя пользователя и пароль верны, вы сохраняете имя пользователя, идентификатор пользователя или что-то еще на сеансе ( $_SESSION['username'] = $username; ).

Всякий раз, когда пользователь загружает какую-либо страницу, вы просто проверяете

 if (isset($_SESSION['username'])) { // $_SESSION['username'] is logged in } else { // nobody is logged in } 

Нет необходимости хранить пароль в $_SESSION (фактически, для целей безопасности лучше не хранить его нигде, кроме хеширования в базе данных).

Теперь функция «запомнить меня» … Во-первых, некоторые соображения:

  • Любой пользователь может изменять файлы cookie своего браузера, поэтому вам нужно быть уверенным, что cookie, отправленный в приложение, не был изменен.
  • Пользователи могут проверять это на общедоступных компьютерах (библиотеках или около того), поэтому вам нужна система, чтобы сделать это недействительным.
  • Если пользователь выходит из приложения, cookie, помнящий его / ее, должен быть удален.

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

Я думаю, что все.