Я использую 2 переменные в cookie (7 дней), которые являются идентификатором пользователя и хешем. Хэш – это кодировка sha1 пользовательского агента и идентификатора пользователя. В этом случае какой-то хакер может войти в систему, который знает браузер украденного файла cookie. Каким образом я должен следовать или какая практика лучше всего помнить о проблемах безопасности?
Хотя вы можете хешировать user_id и secret_key, любой, кто перехватывает этот файл cookie, может войти в ваше приложение. В дополнение к этому вы можете сделать это так, чтобы ваши воспоминания о том, что мои файлы cookie устарели, очень быстро. Никто не любит старое печенье.
Вы можете сохранить отметку времени последнего посещения каждого пользователя в своей базе данных и в файле 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("Ymd 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».
Вы можете просто установить дату истечения срока действия, как сейчас, плюс год в cookie, но затем введите поле ввода пароля во всех чувствительных областях, как и использование Amazon. Угнанный куки-файл предоставит доступ, но для покупки или изменения чего-либо личного требует повторного ввода пароля.
Проблема с таблицами «запомнить меня» заключается в том, что если хакер может получить доступ к этой таблице, он может создать и войти в такое количество учетных записей, сколько захочет. Вы можете утверждать, что это укрепляет безопасность функции помнить меня, но ее нужно взвешивать с риском смягчения областей безопасности колена.
Лично я создаю случайный хэш и сохраняю его в таблице «запомнить меня». В таблице также есть пользовательский агент, идентификатор пользователя и IP-адрес. Я проверяю оба раза каждый раз, когда я повторно ввожу пользователя из функции mem-me. И если пользователь вручную выйдет из системы, я просто удалю эту строку из таблицы. Затем, если они снова войдут в систему, он создает новый случайный хеш. Невозможно бороться с тем, кто обнюхивает пакеты с помощью моей системы (если вы не используете безопасные файлы cookie с установленным флагом HTTPS). Поэтому используйте безопасное соединение с cookie только для HTTPS. Если вы не можете, то, по крайней мере, сделайте хэш-случай, поэтому, если он будет обнаружен, вы можете хотя бы создать новый хеш, чтобы убить этот логин …
В конечном итоге вы можете использовать сеансы для хранения статуса пользователя. Но проведение сеанса так долго вызывает такую же проблему, когда идентификатор сеанса будет украден. Вы можете присоединиться к информации cookie с другим браузером или IP-адресом, но это может вызвать проблему, когда пользователь не имеет статического IP-адреса.
Во всяком случае, сохранение идентификатора сеанса более безопасно, просто вводя пароль пользователя sha1 в файлы cookie.
HMAC
Обычно я делаю так, поэтому мне нечего хранить на стороне сервера в базах данных или подобных.
Вы должны создать случайную строку, которая станет вашим «секретным ключом» и которую вы должны хранить на стороне сервера (возможно, в скрипте config 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