Я просматривал журнал, созданный плагином 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>
обертка.