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

Запретить доступ к сайту на основании QUERY_STRING

Мой сайт «атакован»: боты с разных 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.*$