Мой сайт «атакован»: боты с разных IP-адресов заполняют форму спамерским контентом.
IP-адреса не могут быть отфильтрованы, они всегда разные, поэтому я подумал отфильтровать по QUERY_STRING, чтобы соответствовать следующему URI:
www.site.com/search?field1=spamword&field2=another_spamword
Правило :
rewritecond %{QUERY_STRING} ^(.*)spamword(.*)$
rewriterule .* - [F,L]
Регулярное выражение выглядит правильно, но правило никогда не выполняется. Есть идеи, что происходит?
Спасибо.
Мне не удалось включить журнал перезаписи, поэтому я нашел другой способ и сделал это прямо на всех страницах с формой:
if ( strlen( $_SERVER['REQUEST_URI'] )>650 ) {
header('HTTP/1.0 401 Unauthorized');
.. error message to not panic real users ...
exit;
}
Потому что я обнаружил (просматривая журналы доступа и учитывая поля формы), что URL-адрес длиной более 650 символов никогда не является допустимым запросом. (средний размер 4-6 Кб)
К сожалению, проблема с регулярным выражением все еще существует, и решить ее не удалось. Но, по крайней мере, проблема была частично решена (боты все еще существуют, но страница использует очень мало ресурсов, так как запросы не выполняются)
К счастью, боты распознают ошибку 401 и прекратят работу.
Помимо комментария @Wrikken (проверьте журнал и посмотрите, RewriteEngine
является on
), единственное, что может быть неправильным, - это регулярное выражение. Попробуйте удалить ():
RewriteCond %{QUERY_STRING} ^.*spamword.*$