Задать вопрос
@9StarRu

Как ограничить по времени, доступ по пин-коду?

Создал простенькую проверку пин-кода пришедшего в post запросе

<?php
$pinlist = array_filter(array_map('intval', file(__DIR__ . '/pinlist.txt')));

###
#... еще код ...
###

$pin_code = $_POST["pin_code"];

if (!in_array($pin_code, $pinlist)) {
header("HTTP/1.0 404 Not Found");
echo 'Пин-код недействителен или просрочен';
exit;   
}

###
#... Если пин-код есть в файле pinlist.txt выполняю остальной код ниже к которому и закрыт доступ по пин-коду ...
###


Как ограничить по времени, доступ по такому пин-коду?

Может быть можно как-то в момент первой проверки пин-кода, во время первого post запроса, пришедшему пин-коду назначить временную метку прямо в файле pinlist.txt? Что будет после второго post с данным пин-кодом, т.е. как дать скрипту понять, что для данного кода уже есть временная метка.

К примеру, хочу чтобы пин-код работал ровно 3 месяца.

Файл pinlist.txt содержит строки с дефолтными пин-кодами:

1111111111
2222222222
3333333333
и т.д.

Как сделать так, чтобы при первой проверке пин-кода 2222222222, ему было установлено временное ограничение на 3 месяца и через 3 месяца, данный пин-код (строка) самоудалился из файла pinlist.txt?

Чтобы при следующей проверке, пин-код отсутствовал в файле и закрытый скрипт не выполнился.

p.s. pinlist.txt можно сделать php файлом, буду рад вашим рекомендациям, советам. Возможно как-то проще все можно реализовать, помогите, пожалуйста.

Спасибо!
  • Вопрос задан
  • 106 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 3
Radjah
@Radjah
Нужно как минимум хранить время создания кода. Если не хочется городить MySQL/MariaDB/PostgreSQL/etc, то можно сделать sqlite-базу. По крайней мере не придётся велосипедить средства для поиска и удаления записей.
Ответ написан
Комментировать
Softovick
@Softovick
программист, администратор
Лучше всего воспользоваться базой данных. Сейчас практически в любой можно реализовать Time To Live, по сути - срок жизни записи.
В комментах вы пишите, что запросы будут приходить часто и много - в этом случае действительно с файлом могут возникнуть проблемы.
Если вас смущает накладные расходы на обращение к данным в БД - прочитайте про IN-MEMORY. В MySQL кстати оно есть (не помню в какой версии, в MariaDB 10 точно видел упоминание).
Лично я бы взял Redis и работал бы с ней, благо данных не много, ОЗУ много не потребуется. А работает она очень быстро. И функциональность достаточная, что потом может пригодится для хранения других данных или например для реализации очередей, хранения сессий, оповещений и т.п. А TTL там заложено на уровне движка - добавляете запись, при добавлении можно сразу установить срок жизни в секундах и запись сама удалится по истечении времени. А можно без указания TTL (в 0) и тогда запись не удалится.
Так и вижу - заносите доступные пин-коды с TTL=0, а когда их активируют - указываете для записи TTL нужной длительности и с момента первой активации начинает тикать счетчик. Удобно же и никаких велосипедов изобретать не надо. С Redis работать просто почти в любом ЯП сейчас, очень простое и легкое API.
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега PHP
♬♬
Вот вы и столкнулись с задачей, несовместимой с планом сделать все на коленке без “излишков” вроде БД и фреймворка.

На текстовом файле сделать можно, но это сломается при почти-одновременных запросах и будет заметно тормозить. С очередным пином есть 4 варианта: нет в списке, есть и ранее не использовался, есть и прошло менее 90 дней, есть и просрочен. В 2 из них надо вносить в файл изменения: помечать время или удалять запись. Для файла нет операции “вставить в середине или удалить из середины файла байты с А по Б”, поэтому придется создавать новый файл, переписывая все строки кроме удаляемой, и потом заменять старый файл новым.
Медленно и неэффективно.

Все-таки разберитесь с MySQL. Это модно, спортивно, современно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы