2014-01-17 3 views
2

У меня есть веб-сайт, на котором пользователь может выбрать для веб-сайта, чтобы «запомнить меня» (AKA установил cookie) и за советом на этом веб-сайте, я переключил шифрование пароля в базе данных на функцию php password_hash(). Теперь я не могу просто сравнить любой старый хэш друг с другом, поэтому я использую php's password_verify(). Для проверки пароля требуется открытый текст и хэш пароля.Шифрование/дешифрование файлов cookie

Как я могу сохранить пароль пользователя в cookie браузера, не будучи открытым текстом?

ответ

3

Хранение пароля в самом файле cookie - это действительно плохая идея, не делайте этого.

На очень высоком уровне, я бы:

  1. Сформировать маркер (с чем-то вроде md5), который состоит из нескольких уникальных (пока последовательно) атрибуты для этого пользователя
  2. магазин как идентификатор пользователя и этот токен в cookie (разделенный каким-то известным разделителем)
  3. Когда пользователь посещает ваш сайт, вы можете разделить идентификатор и токен
  4. Используйте идентификатор, чтобы извлечь запись пользователя из базы данных, создать новую токена из записи БД и сравнить с маркером печенья

Итак, давайте рассмотрим это кратко. Скажем, $hash - это хеш-пароль, хранящийся в базе данных, а также у вас есть переменные $userId и $username.

Я бы генерировать печенье, который выглядит примерно так:

$token = md5($userId . $username . $hash); 
$cookie = $userID . "|" . $token; // 1|XXXXXXXX 

Теперь, когда пользователь посещает ваш сайт, и вы получите это печенье:

$parts = explode("|",$cookie); 
$userId = $parts[0]; 
$token = $parts[1]; 

Теперь вы знаете, кто является пользователь требуя, чтобы был, но вам нужно подтвердить.

Извлеките запись пользователя из базы данных, а затем восстановите токен и сравните.

// Assuming you just ran a SELECT query, and fetched the result into `$row` 
$dbToken = md5($row['userId'] . $row['username'] . $row['hash']); 
if($token == $dbToken) { 
    // The user is who he claims to be! Log them in 
} else { 
    // The cookie token didn't match our re-generated token, don't trust this cookie 
} 

Имеют смысл? Вам, вероятно, придется немного изменить это для вашей ситуации. Надеюсь, это поможет вам хоть как-то пойти в хорошем направлении.

+0

У меня был такой длинный ответ, говорящий то же самое, и тогда вы сказали это лучше. +1 хороший ответ. –

+0

Я думаю, что сработало (как в настройке файлов cookie), и моя единственная проблема в том, что способ проверки cookie на самом деле не работает. [Код] (http://pastebin.com/2nGTDnF8) (См. Выделенную строку) – mrkirby153

+0

@ mrkirby153 Рад, что подход, похоже, работает для вашей ситуации. Что касается отладки вашего класса, начните с выполнения 'print_r ($ _ COOKIE)', чтобы узнать, что у вас есть на самом деле. Может быть, массив файлов cookie не совсем то, что вы ожидаете? Может быть, 'verifyDatabase' не вызывается? Я думаю, что у вас есть некоторая общая отладка PHP для работы с точки зрения того, как работает ваш код, не связанный с тем, как токены файлов cookie работают. – jszobody

Смежные вопросы