Лучшая практика для запомнить меня особенность [duplicate]

8
задан Cœur 13 December 2017 в 05:23
поделиться

5 ответов

Хотя вы можете хэшировать user_id и secret_key, любой, кто перехватит этот cookie, сможет войти в ваше приложение. Кроме того, вы можете сделать так, что ваши cookie-файлы remember me будут очень быстро устаревать. Никому не нравится несвежее печенье.

Вы можете хранить отметку времени последнего посещения каждого пользователя в вашей базе данных и в cookie. Каждый раз, когда вы считываете cookie, чтобы зарегистрировать пользователя, вы проверяете, совпадают ли обе временные метки. Если они не совпадают, откажите пользователю. Если совпадают, обновите временные метки.

При использовании этого метода каждый раз, когда пользователь возвращается на ваш сайт, все старые файлы cookie становятся несвежими. Хакер, перехвативший cookie, теперь имеет бесполезный несвежий cookie, поскольку он не знает точную временную метку в текущем cookie. Конечно, хакер может использовать свежий cookie столько, сколько захочет, пока пользователь снова не войдет в систему.

//check for cookie
if(isset($_COOKIE['remember_me'])) {
   // get hash and time stamp from cookie
   $hash = substr($_COOKIE['remember_me'],0,40);
   $last_visit = substr($_COOKIE['remember_me'],41);

   // query your db with $hash and $last_visit

   // if hash and time stamp match up
      // log in

      // store the current time stamp in a variable to use for both
      $time = date("Y-m-d H:i:s");
      // update the time stamp in your cookie
      $cookie = $pass . "-" . $time;
      setcookie('remember_me', $cookie, time()+60*60*24*100, '/');
      // update the time_stamp in your database
   else {
      // remove the remember me cookie
      setcookie('remember_me', '', time()-42000, '/')
   }

Этот метод обеспечивает небольшую степень безопасности, и его, безусловно, следует использовать наряду с методами, предложенными в других ответах. В cookie должен храниться хэшированный ключ. Запоминающий меня файл cookie не может быть абсолютно безопасным, поэтому для любого дополнительного доступа к особо важным данным или функциям приложения необходимо повторно вводить пароль.

Я также рекомендую назвать ваш файл cookie как-то иначе, чем 'remember_me', чтобы его было немного сложнее найти. Хотя это не добавляет безопасности, если вообще добавляет, именование cookie 'ht33424' занимает столько же времени, сколько и именование 'remember_me' или 'hack_me'.

6
ответ дан 5 December 2019 в 21:15
поделиться

Со временем вы можете использовать сеансы для хранения статуса пользователя. Но длительное удержание сеанса вызывает ту же проблему, когда идентификатор сеанса будет украден. Вы можете присоединиться к информации о файлах cookie с каким-либо другим - например, браузером или IP-адресом, но это вызовет проблему, если у пользователя нет статического IP-адреса.

В любом случае, хранение идентификатора сеанса безопаснее, чем просто сохранение пароля пользователя, закодированного с помощью sha1, в куки.

0
ответ дан 5 December 2019 в 21:15
поделиться

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

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

1
ответ дан 5 December 2019 в 21:15
поделиться

Лично я создаю случайный хэш и сохраняю его в таблице «запомнить меня». В таблице также указаны пользовательский агент, идентификатор пользователя и IP-адрес. Я проверяю и то, и другое каждый раз, когда повторно авторизуюсь для пользователя с помощью функции «запомнить меня». И если пользователь вручную выходит из системы, я просто удаляю эту строку из таблицы. Затем, если они снова войдут в систему, он создаст новый случайный хеш. На самом деле нет никакого способа бороться с кем-то, перехватывающим пакеты, с помощью системы «запомни меня» (если только вы не используете безопасные файлы cookie с установленным флагом только HTTPS). Поэтому используйте безопасное соединение с файлами cookie только HTTPS. Если не можете, то хотя бы сделайте хэш случайным, чтобы в случае его обнаружения вы могли хотя бы сгенерировать новый хеш, чтобы уничтожить этот логин ...

0
ответ дан 5 December 2019 в 21:15
поделиться

HMAC

Обычно я делаю так, поэтому мне нечего хранить на стороне сервера в базах данных и т.п.

Вы должны сгенерировать случайную строку, которая станет вашим «секретным ключом» и которую вы должны сохранить на стороне сервера (возможно, в конфигурационном скрипте php как константу), и вы никогда никому не скажете. Я назову этот секретный ключ SECRET_KEY .

Затем ваш файл cookie должен установить два значения:

  • USER_ID : идентификатор пользователя, который получит автоматический вход в систему
  • HASH : безопасный криптографический хэш USER_ID и SECRET_KEY . Так, например, md5 (USER_ID. "-". SECRET_KEY) . (Предпочтительно что-то отличное от md5, например sha1 или sha256).

Таким образом, ваш последний файл cookie может быть: USER_ID: HASH .

Затем, когда вам нужно проверить, является ли файл cookie подлинным файлом cookie «запомни меня», вы должны сделать это:

function isCookieGenuine($cookie_value) {
  list($value, $hash) = explode(':', $cookie_value, 2);

  if (md5($value . "-" . SECRET_KEY) == $hash)
    return true;
  else
    return false;
}

Дело в том, что только вы можете сгенерировать хэш, который проходит эту проверку, потому что хешу требуется не только USER_ID , но также SECRET_KEY , который неизвестен никому, кроме сервера! :)

Как отмечено в комментариях, вы можете сделать это с помощью функции hash_hmac в PHP> = 5.1.2: http://us.php.net/manual/en/ function.hash-hmac.php

0
ответ дан 5 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: