Назад | Перейти на главную страницу

htaccess правило для защиты от злонамеренных почтовых запросов к WordPress index.php? pubkey =

Я просматривал журнал, созданный плагином WordPress под названием Bad Behavior, и в нем есть много записей с разных IP-адресов в разные промежутки времени в течение дня, которые запрашивают следующий URL:

POST www.example.com/index.php?pubkey=b13bdb8297326599cf86aj25274e6a0c&bvTime=1549500166&bvVersion=0.1&bvMethod=getdata&sha1=true&sig=53fb643e40685ed89aa6754483b0a0d06bf1e63d0

Та же часть URL-адреса - /index.php?pubkey= тогда остальное отличается для других записей в журнале.

Что я хочу сделать, если это возможно, так это заблокировать эти почтовые запросы через .htaccess в корневом каталоге.

Во время исследования я нашел здесь ответ: Ограничить доступ к index.php - Apache

Но поскольку я не очень понимаю, как правильно строить директивы в .htaccess файла, я не хочу добавлять туда что-то, что потенциально может заблокировать законный трафик или вызвать другие проблемы.

Также во время поиска я нашел эту информацию на https://perishablepress.com/protect-post-requests/ но они предупреждают вас, что использование следующего правила может быть проблематичным, если веб-сайт не является статическим и использует формы, как на этом конкретном веб-сайте.

#deny all POST requests
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} POST
RewriteRule .* - [F,L]
</IfModule>

Итак, с учетом сказанного, я надеюсь, что здесь было добавлено достаточно информации, которая может помочь кому-то найти ответ на эту конкретную проблему.

Решение действительно очень похоже на вопрос, с которым вы связались.

Однако я хотел бы задать один вопрос: нужно ли вам специально настраивать таргетинг на запросы POST? Почему не запускается любой запрос (GET или POST)/index.php?pubkey=? Или это имеет какое-то другое значение в WordPress?

В этом случае вы можете сделать что-то вроде следующего в верхней части .htaccess файл:

RewriteCond %{QUERY_STRING} ^pubkey=
RewriteRule ^index\.php$ - [F]

Нет необходимости в <IfModule> обертка. Нет необходимости повторять RewriteEngine директива, поскольку она, несомненно, установлена ​​позже в файле.


Чтобы специально настроить запросы POST, вы можете добавить еще одно условие, как в своем примере:

RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{QUERY_STRING} ^pubkey=
RewriteRule ^index\.php$ - [F]

ОБНОВИТЬ: это не сработало, как я ожидал, так как я смог загрузить страницу, посетив www.example.com/index.php?pubkey=

Это могло произойти, если указанная выше директива находится в неправильном месте в .htaccess файл и конфликтует с другими директивами. Он должен быть на самом верху .htaccess перед любыми существующими директивами mod_rewrite.

После некоторых проб и ошибок это то, что меня полностью заблокировало, это работает, но я не понимаю, почему, не могли бы вы объяснить разницу между тем, что вы мне дали, и этим?

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (pubkey=.*) [NC]
RewriteRule (.*) - [F,L]
</IfModule>

Это гораздо более общий характер и блокирует гораздо больше, чем просто URL, указанный в вашем вопросе (возможно, слишком много). Эти директивы блокируют любой URL-путь, содержащий pubkey= (без учета регистра) везде в строке запроса. Таким образом, он заблокирует следующие URL-адреса (в дополнение к URL-адресу, указанному выше):

  • example.com/foo/bar?pubkey=xyz
  • example.com/foo/bar/baz?abc=1&xyz=2&pubkey=
  • example.com/foo/bar/baz?def=2&xyz=3&PuBkEy=xyz

Эти директивы можно упростить:

RewriteCond %{QUERY_STRING} pubkey= [NC]
RewriteRule .* - [F]

Не нужно захватить в RewriteRule шаблон или CondPattern. Регулярное выражение pubkey= такой же как pubkey=.*. В L флаг не требуется, когда F флаг используется. И как было сказано выше, повторять RewriteEngine директиву или используйте <IfModule> обертка.