Вопрос

Этот вопрос уже имеет ответ здесь:

Я использую 2 переменных в файле cookie (7 -дневное истечение), которое является идентификатором пользователя и хэшем. Хэш - это SHA1 Encode пользовательского агента и идентификатора пользователя. В этом случае какой -то хакер может войти в систему, кто знает браузер украденного печенья. Каким образом я должен следовать или какая практика лучше всего подходит для меня запоминает проблемы безопасности?

Это было полезно?

Решение

В то время как вы можете хэшировать user_id и secret_key, любой, кто перехватывает этот файл 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, '/')
   }

Этот метод обеспечивает небольшое количество безопасности и, безусловно, следует использовать по боковым методам, предложенным в других ответах. Ключ с хешированием должен храниться в печенье. Ammpe Me Cookie не может быть совершенно безопасным, поэтому для любого дополнительного доступа к очень конверсительным данным или функциям приложения необходимо потребовать повторного входа пароля.

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

Другие советы

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

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

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

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

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

HMAC

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

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

Тогда ваш cookie должен установить два значения:

  • USER_ID: Идентификатор пользователя пользователя, который получит автоматический вход в систему
  • HASH: Безопасный криптографический хеш USER_ID и SECRET_KEY. Анкет Так, например, md5(USER_ID . "-" . SECRET_KEY). Анкет (Что -то отличное от MD5, такое как SHA1 или SHA256, предпочтительнее).

Так что ваше последнее печенье может быть: USER_ID:HASH.

Затем, когда вам нужно проверить, является ли печенье подлинным, помните меня 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top