Я хочу заблокировать одни и те же повторяющиеся запросы к моему сайту. Например, кто-то нажимает кнопку «Обновить» 3 раза, поэтому я хочу, чтобы те же запросы, следующие от этого пользователя, автоматически блокировались.
Я знаю, что могу сделать это с помощью PHP или любого другого серверного языка программирования, но есть ли какое-нибудь «портативное» решение, независимое от веб-сайта, например конфигурация Apache2 или правило iptables?
Есть ли другие способы такой базовой защиты?
Я почти уверен, что если бы вам удалось заставить эту работу в iptables, это было бы очень плохой идеей. iptables понимает уровни 3 и 4 Модель OSI; HTTP-запросы находятся на уровне 7.
Поскольку HTTP - это протокол без сохранения состояния, и вы пытаетесь дать другой ответ в зависимости от текущего состояния, вам понадобится какой-то метод отслеживания состояния. Обычно это делается с помощью файлов cookie, хотя это не единственный способ отслеживать состояние. mod_rewrite
имеет возможность устанавливать и читать файлы cookie и сопоставлять их с регулярными выражениями, поэтому сначала мы попробуем это.
Вы можете использовать эти правила, чтобы вызвать любой запрос страницы, который слишком быстро следует за другим, чтобы блокировать:
RewriteRule (\.html|\.php)$ - [CO=recent:true:example.com:1:/]
RewriteCond %{HTTP_COOKIE} recent=true
RewriteRule (\.html|\.php)$ - [F]
Первое правило устанавливает cookie для каждого .html
или .php
страница со сроком действия одна минута. Следующая пара или правила вызывают любой запрос на .php
или .html
страницу с этим файлом cookie (т.е. в течение одной минуты), которая будет отклонена. Через минуту печенье должен истекает и больше не будет отправлено.
Здесь есть недостатки: он не ограничивается одним и тем же URL-адресом, поэтому каждый запрос страницы должен быть через минуту после предыдущего, а время истечения срока действия выражается в минутах, поэтому одна минута - это самое короткое время. Вы ограничены 403 ответами, которые не обязательно очень дружелюбны или информативны. Это лучшее, что я могу сделать с Apache. nginx имеет более похожий на программирование язык конфигурации, который может позволить вам выполнять сравнение URI, необходимое только для блокировки обновлений страницы, а не других запросов.
Использование PHP (или чего-то еще) для размещения текущего URL-адреса и метки времени в сеансе (или сохранение IP-адреса и порта источника в базе данных вместе с текущим URL-адресом и меткой времени. Это можно сделать, если ваши клиенты не поддерживают файлы cookie). позволит вам провести сравнение. Если текущий URL-адрес и URL-адрес сеанса совпадают, а отметка времени находится в пределах некоторого порогового значения текущего времени, вы можете отправить им другой ответ. С помощью PHP (в отличие от Apache) вы можете отправить ответ 503 (что имеет больше смысла) с некоторым соответствующим текстом, чтобы объяснить, почему они получают этот ответ вместо ожидаемой страницы.
На мой взгляд, лучший вариант - это Javascript и / или привязка клавиш. Свяжите клавиши, которые выполняют обновление (Cmd + R на Mac, Ctrl + R, F5 везде), чтобы вы могли их перехватить и использовать Javascript, чтобы предложить пользователю немного подождать, прежде чем нажать кнопку обновления. Этот вариант обеспечивает наилучшее взаимодействие с пользователем и минимально влияет на ваш сервер.