Срок действия кода unix или time () истекает через x часов

#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). Учитывая УНИКАЛЬНЫЙ индекс в хэше, это может возвращать только одну строку или ни одной строки.

УНИКАЛЬНЫЙ индекс в идентификаторе учетной записи гарантирует, что пользователи не смогут запрашивать многократные перезагрузки в течение срока действия.