#php
#php
Вопрос:
Я пытаюсь создать функцию «забыли пароль», срок действия ссылки, созданной через x часов, истечет. Итак, я сохраняю time()
данные в значении базы данных, когда пользователь запрашивает сброс пароля. Итак, как я могу истечь?
Ответ №1:
три варианта:
- сравните время, которое вы сэкономили в базе данных, с тем, которое вы получаете, когда пользователь нажимает на ссылку
- Используйте задание cron и заставляйте его периодически запускаться
- Просто не сохраняйте в БД и сделайте ссылку, чтобы заботиться обо всем. Вы могли бы использовать подпись соль, чтобы пользователи не могли изменять эту ссылку
Нравится:
$now = time();
$sk = sh1($user_id . $now . "yoursupersalthere")
$link = "http://www.example.com/forgot.php?id={$user_id}amp;ts={$now}amp;sk={$sk}"
это будет ссылка, которую вы отправили пользователю. Затем, чтобы выполнить проверку
$ts = $_GET['ts'];
$user = $_GET['id'];
$sk = $_GET['sk'];
if (!$sk == sh1($user_id . $now . "yoursupersalthere")) {
die("bad signature");
}
elseif (time() - $ts > 3600 /* or put your expiration limit */) {
die('link expired');
}
// do your job
Комментарии:
1. Вариант 3 бесполезен. Мое альтер-эго blackhat может попробовать forevah, изменив ts= в строке запроса.
2. что обошлось вам дороже ? просто продолжайте пытаться нажать на salt / ts и перейти на веб-сервер или сделайте то же самое, но продолжайте заходить в db только для проверки ts . Если вы спросите меня, я предпочитаю обращаться только к веб-серверу. Я думаю, что это вопрос относительно того, какой подход использовать. Ничто не является абсолютным
3. Я могу получить ваше преимущество, создав одну действительную учетную запись и сбросив ее пароль. Таким образом, я всегда буду обращаться к базе данных и могу сбросить случайные пароли, используя идентификатор учетной записи. Во-вторых, я могу запросить бесконечное количество сбросов для одной учетной записи, если вы не отметите учетную запись как «в сбросе» во время создания ссылки.
4. Я думаю, что отправка его по ссылке не является хорошей практикой, можно легко манипулировать временем, если оно есть в параметрах.. Хотя ваша логика прекрасна, но небезопасна…
Ответ №2:
Вероятно, у вас есть запись в таблице со ссылкой сброса, просто добавьте в нее поле даты, а затем либо включите WHERE expiredate<NOW()
, либо время от времени очищайте таблицу с помощью простого DELETE from table WHERE expiredata<NOW()
.
Ответ №3:
Один из способов сделать это — проверить, истекает ли срок действия ссылки при нажатии на ссылку — некоторый псевдокод:
// when the link is clicked pull the information from the database and get the time
// SQL goes here
// this will give you the difference in seconds
$diff = time() - $timestamp_from_db;
// we'll pretend the time expires in 8 hours
$expires_in = 8 * 60 * 60;
// for this example we'll pretend the expiration is 8 hours
if($diff <= $expires_in)
{
// has not been more then 8 hours
}
else
{
// has been more then 8 hours
}
Ответ №4:
Лучший способ сделать это, чтобы сохранить таблицу чистой, — реализовать следующее:
- В таблице необходим как минимум идентификатор учетной записи с УНИКАЛЬНЫМ индексом и внешний ключ к таблице accounts, хэш с УНИКАЛЬНЫМ индексом и временная метка.
- На странице, которая создает ссылку, не разрешайте «сбросить мой пароль» на основе информации, которая может быть получена случайным человеком. Если вы сделаете это, можно заполнить вашу таблицу запросами на сброс пароля и генерировать спам и проблемы с безопасностью у ваших пользователей.
- На странице, где проверяется ссылка, сначала удалите все записи с истекшим сроком действия, сравнив NOW() с сохраненной меткой времени, затем просто ВЫБЕРИТЕ, используя WHERE=’$hash’ (конечно, вы очистите $ hash). Учитывая УНИКАЛЬНЫЙ индекс в хэше, это может возвращать только одну строку или ни одной строки.
УНИКАЛЬНЫЙ индекс в идентификаторе учетной записи гарантирует, что пользователи не смогут запрашивать многократные перезагрузки в течение срока действия.