2015-03-27 4 views
1

В настоящее время я пытаюсь создать забытую систему паролей, где он отправляет пользователя и электронную почту с помощью токена сброса. Затем пользователь использует маркер сброса для сброса пароля. В действительности токен сброса будет истечен (во время тестирования я истекаю через 1 минуту после отправки электронной почты).MySQL, удаляющий истекшие значения

В моем забыли файл паролей PHP У меня есть это право перед отправкой электронной почты (обратите внимание, что $ маркер маркер, который был выдан):

$query2 = $con->prepare("UPDATE UserName SET resetkey = '$token', expire = NOW() + INTERVAL 1 MINUTE WHERE userName = :user"); 
$query2->bindParam(':user',$username); 
$query2->execute(); 

Затем в моем файле паролей сброса PHP У меня есть это они сбрасывают свои пароли. Это в основном удаляет все истекшие значения, так что таблица не будет иметь просроченное значение:

$purge = $con->prepare("UPDATE UserName SET resetkey = NULL WHERE expires < NOW()"); 
$purge->execute(); 

Проблемы я бег в том, что пользователь все еще может восстановить свой пароль, даже если он входит маркер истек. Я убедился, что время правильное (и я даже ждал 5 минут, чтобы быть уверенным). Однако токен должен истечь через минуту. Может ли кто-нибудь объяснить мне, почему это происходит? Спасибо!

+0

Вы также должны установить resetkey на null, где resetkey = '$ token'. Это отсутствует в вашем дизайне. Не забывайте, чтобы real_escape $ token предотвращал SQL-инъекцию. –

+0

Похоже, вы только удаляете истекшие жетоны * после того, как * токен был проверен. Убедитесь, что вы выполните шаги в правильном порядке! – eggyal

+0

@YusufMoola Что такое real_escape? Я слышал о SQL-инъекции, и я использую PDO-запросы. –

ответ

0

В вашем первом запросе используется имя столбца «expire». Во втором запросе вы используете имя столбца «expires».

+0

А, спасибо, это была моя проблема. Я кодирую это в Notepad ++, так что есть ли какие-либо PHP-редакторы или редакторы кода, которые вы можете мне порекомендовать. Благодаря! –

+0

@KevinShen: В то время у меня не было хорошей рекомендации для вас. Теперь я использую [PHP Storm] (https://www.jetbrains.com/phpstorm/) и нахожу его вполне пригодным для использования. – seanvalencourt

2

Я думаю, что arcodesign дал уже правильный ответ, но мне интересно, почему вы решили его таким образом. Для моих проектов я всегда создаю отдельную таблицу с token-hash, user-id и creation-date записи сброса.

token-hash: Там вы храните хэш токена, а не сам токен. В противном случае злоумышленник с доступом для чтения к базе данных (SQL-инъекция) может потребовать сброс пароля для любого адреса электронной почты, который ему нравится, и потому, что он может видеть новый токен, он может использовать его для установки своего собственного пароля.

user-id: С помощью отдельной таблицы вы можете просто удалить строку, если срок службы устарел, или вы можете оставить его и попросить пользователя потребовать новый сброс.

Дата размещения: Я бы хранить дату создания (только NOW()) вместо даты истечения срока, приложение может затем решить, если эта дата истекла. Вы также можете изменить период, когда ссылка сброса действительна без миграции существующих строк.

Возможно, вы хотите взглянуть на мой класс password-reset, который помогает при построении таких токенов.

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