@WizardOfRain

Memcaсhe для почтового скрипта?

Цель: защита от спама в форме обратной связи на сайте.
Ограничить макс. число писем с одного IP в минуту 3 штуками, в час 10.
Думаю использовать два ассоциативных одномерных массива. В качестве индекса IP адрес, в качестве значения целочисленный счетчик.
Вопрос: как сделать так, чтобы значение счетчика не обнулялось через минуту или час, а сбрасывалось на единицу через минуту после инкрементации (инкрементация на единицу происходит при обращении к скрипту)?
Примерная запись:
$memcache_obj = new Memcache;
$memcache_obj->connect('127.0.0.1', 11211) or die(«Could not connect»);

$memcache_obj->set[$s_min, $min_array, false, 60];
$memcache_obj->set[$s_hour, $hour_array, false, 3600];
  • Вопрос задан
  • 2425 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
У меня была похожая задача с запросами к апи, ограниченными по времени: не более 3 в секунду с одним токеном. Думаю, вам подойдёт такой алгоритм:

Хранить в качестве значения массив времён (unix timestamp: time()) последних обращений.

"8.8.8.8" => "1321009871,1421009871,1521009871"

При поступлении очередного смотрим, сколько значений сейчас в массиве.
Меньше 3 – выполняем запрос.
3, но время последнего более, чем достаточно назад – выполняем запрос.
Иначе отклоняем.

При выполнении запроса добавляем в начало массива текущее время, и стираем лишние элементы, если больше 3 получилось.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
KorroLion
@KorroLion
Попробуйте рекапчу: https://www.google.com/recaptcha/intro/index.html
Или некапчу: habrahabr.ru/company/mailru/blog/255633

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

Ограничить макс. число писем с одного IP в минуту 3 штуками, в час 10.

Очень интересно, откуда взялись такие лимиты? Расчет на то, что на сайт никто заходить не будет?
Стоит отметить, что через gprs один айпишник может быть на тысячи (если не десятки тысяч) пользователей.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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