Где я могу найти реализацию PHP/MySQL решения "Постоянное входное Cookie" Чарльза Миллера?

Я снова и снова видел Чарльза Миллера " Persistent Login Cookie Best Practice" рекомендуется здесь как абсолютный лучший способ реализации функции "Запомнить меня" на сайте (если вам действительно нужна эта функция, которую я делаю).

Тем не менее, я просмотрел веб-сайт, и я не могу найти какой-либо реальный код PHP/MySQL, реализующий его решение, и поскольку "безопасность" была подчеркнута примерно в 19 раз по поводу использования "Запомнить меня", я боюсь самому закодировать его с нуля, опасаясь, что я неправильно пойму что-нибудь или сделаю ошибку, которая приведет к массивной дыре в безопасности.

Поскольку его решение составляет почти 10 лет и, как представляется, является самым популярным ответом в отношении постоянных файлов cookie для входа в систему, наверняка должен быть некоторый проверенный PHP/MySQL код, который правильно следует его решению без каких-либо непреднамеренных дыр в безопасности. (Самое близкое, что я нашел, это модуль Drupal, но я не использую Drupal.)

Кто-нибудь знает, где я могу его найти?

Ответы

Ответ 1

После прочтения вопроса о StackOverflow Ive было вдохновлено помочь ему, написав реализацию PHP/MySQL Чарльза Миллерса "Persistent Login Cookie Best Practice". В этом учебнике я предполагаю, что у вас уже есть система PHP с логином пользователя.

CREATE TABLE user_sessions (
  user_id INT(11) UNSIGNED NOT NULL,
  session VARCHAR(39) NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  PRIMARY KEY (user_id, session)
);

Сначала нам нужно обновить сайт, когда вы входите в систему, чтобы сохранить сессию в файле cookie. Этот код будет работать с вашей текущей системой входа.

if (/* Code that verifies credentials */) {
  // ... code to log user into session

  PersistentAuth::login($userId);
}

Во-вторых, мы хотим проверить, есть ли у нового пользователя на сайте учетные данные cookie. Этот код будет идти в начале вашего кода. Он проверяет, во-первых, мы уже вошли в нашу $_SESSION? если нет, попробуйте войти в систему на основе файлов cookie.

if (/* !loggedIn() */ && ($userId = PersistentAuth::cookieLogin())) {
  // ... use $userId to log user into session 
}

В-третьих, в соответствии с статьей Чарльза Миллерса мы не можем разрешить пользователю следующие разделы, если они вошли в систему через файл cookie:

  • Изменение пароля пользователя
  • Изменение адреса электронной почты пользователей (особенно если используется восстановление пароля на основе электронной почты)
  • Любой доступ к адресу пользователя, платежным реквизитам или финансовой информации.
  • Любая возможность совершить покупку

код:

if (PersistentAuth::isCookieLogin()) {
  // User is logged in via cookie and don't have access to this 
  // section. We need to ask them for the password. Maybe send 
  // them to some login page?

  // TODO ask for password or send to a password page
}

Чтобы получить весь код для проверки статуса PersistentAuth, мой сайт здесь: http://www.chrislondon.co/php-persistent-login/

С этим классом PersistentAuth есть несколько изменений, которые вам нужно будет сделать. Один из них должен изменить функцию getDb(), чтобы вернуть экземпляр вашей базы данных. Я использую PDO в этом примере. Я настроил каждую обновленную страницу, очистив базу данных старых сеансов. Лучший способ справиться с этим - использовать cron. Если вы настроили cron, измените флаг USE_CRON на true в настройках класса