我的 access.log 充满了:
Mozilla/5.0 (compatible; DotBot/1.1; http://www.opensiteexplorer.org/dotbot, [email protected])
CCBot/2.0 (http://commoncrawl.org/faq/)
Mozilla/5.0 (compatible; spbot/5.0.3; +http://OpenLinkProfiler.org/bot )
Mozilla/5.0 (compatible; MJ12bot/v1.4.8; http://mj12bot.com/)
Mozilla/5.0 (compatible; SeznamBot/3.2; +http://napoveda.seznam.cz/en/seznambot-intro/)
以及:
85.55.237.132 - - [16/Jul/2018:06:30:44 +0000] "GET /wp-login.php HTTP/1.1" 404 11462 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
51.253.65.140 - - [16/Jul/2018:06:30:47 +0000] "GET /wp-login.php HTTP/1.1" 404 7645 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
113.161.75.37 - - [16/Jul/2018:06:30:57 +0000] "GET /wp-login.php HTTP/1.1" 404 12145 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
114.94.208.2 - - [16/Jul/2018:06:31:04 +0000] "GET /wp-login.php HTTP/1.1" 404 11096 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
112.134.172.163 - - [16/Jul/2018:06:31:07 +0000] "GET /wp-login.php HTTP/1.1" 404 11177 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
144.48.75.34 - - [16/Jul/2018:06:31:13 +0000] "GET /wp-login.php HTTP/1.1" 404 7736 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1"
并且我的网站都不是 wordpress 的。
目前,我通过 UFW 阻止 IP 访问这些 IP,但它们已达数千个,并且每天的数量都在增加。
有没有办法对 Ubuntu 举例来说:
If the user-agent (or requested URL) contains "Mjbot" block it.
我见过一些工具,例如 Fail2ban、modsecurity 等,但它们似乎使事情变得复杂而不是简化。
我正在寻找一个非常简单的解决方案。
答案1
通过使用 可以轻松完成此操作mod-rewrite
。只需修改您的开始部分.htaccess
即可
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} *Mjbot* [NC]
RewriteRule .* - [F,L]
</IfModule>
您可以*Mjbot*
用您选择的正则表达式替换
该RewriteCond
指令设置了“重写”或修改 URL 的条件。在本例中,它会检查变量是否与不区分大小写的HTTP_USER_AGENT
正则表达式匹配*Mjbot*
[NC]
该RewriteRule
指令告诉 apache 对所有在此.htaccess
( .*
) 下的请求都以 403 Forbidden (标志F
) 进行响应,并在之后立即停止重写过程 (L
标志)
此外,您还可以通过使用已打包的mod_setenvif
为此,请.htaccess
添加以下行:
SetEnvIf User-Agent "*Mjbot*" dontlog
答案2
我认为它不起作用......
我在 apache2.conf/httpd.conf 中有这样的规则
RewriteCond %{REQUEST_URI} wp-login.php$ [NC]
RewriteRule .* - [F,L]
如果我使用 curl 发送一个 URL,我会看到以下内容:
curl -Is https://www.alebalweb-blog.com/wp-login.php | head -n 1
HTTP/2 404
我难道不应该看到 403 吗?
事实上,如果我直接在网站的 .htaccess 上添加相同的规则,我会看到以下内容:
curl -Is https://www.alebalweb-blog.com/wp-login.php | head -n 1
HTTP/2 403
因此我对 apache2.conf/httpd.conf 中的 URL 重写规则进行了一些研究,发现有很多人对此感到困惑,也有很多困惑。
在许多事情中,有些事情能让人更清楚,但也有让人困惑的地方,比如这个:http://tltech.com/info/rewriterule-in-htaccess-vs-httpd-conf/
这里说了url重写的规则必须用标签括起来:
<Directory></Directory>
但是想要使用 apache2.conf/httpd.conf 时我不明白在哪个,我的 apache2.conf 中已经有 3 个:
<Directory />
<Directory /usr/share>
<Directory /var/www/>
我尝试添加一个标签:
<Directory>
在文件开头的代码周围,Apache 不喜欢它。
所以我尝试这样做:
<Directory />
apache 没有什么抱怨,但它似乎不起作用。
所以我尝试这样做:
<Directory /var/www/>
Apache 再次没有抱怨,但它似乎没有改变任何东西。
然后我尝试了一下,不添加标签,而是直接在现有的标签中输入URL重写规则,但是apache不喜欢。
然后我再次搜索并发现了这一点:https://stackoverflow.com/questions/344588/how-can-i-implement-a-global-rewritecond-rewriterule-in-apache-that-applies-to
这里他们讨论了 URL 重写的新选项:InheritDown、InheritDownBefore、IgnoreInherit。
但是再次想要使用 apache2.conf/httpd.conf,我应该把这些新选项放在哪里以及我的规则放在哪里?
我确信所有这些都能起作用,但我需要弄清楚每个部件应该放在哪里才能使一切正常工作。
有人能帮助我吗?
答案3
如果有的话,也许你应该买一本有关 fail2ban 的书。
您在回答中提出了更多问题。解决您的第一个问题不是更有意义吗?
如果你想知道我的答案/意见:从 Apache 更改为 Nginx 并执行类似的操作:
if ($http_user_agent ~* "AhrefsBot")
{
rewrite .* /error.php?e=403 last;
}
在 error.php 中,您可以通过 $_SERVER 从请求者处获取更多数据并将其通过电子邮件发送给您,或者最好将其放在日志文件中。
禁止GET参数的SQL就更好玩了:
if ($query_string ~* "(alter|delete|update|select)(?![a-z._-])")
{
set $lalala "bad_main_word";
}
if ($query_string ~* "1=1|ALL|DISTINCT|ON|AS|FROM|WHERE|GROUP|BY|HAVING|WINDOW|UNION|INTERSECT|EXCEPT|ORDER|ASC|DESC|USING|NULLS|FIRST|LAST|LIMIT|OFFSET|ROW|ROWS|FETCH|NEXT|ONLY|FOR|NO|KEY|SHARE|OF|NOWAIT|LATERAL|NATURAL|TABLE|CURRENT|RETURNING")
{
set $lalala "${lalala}_and_bad_sub_word";
}
if ($query_string ~ "Put some RegEx here to whitelist your stuff, check your mail/log!")
{
set $lalala "whitelist";
}
if ($lalala = "bad_main_word_and_bad_sub_word")
{
rewrite .* /error.php?e=403 last;
}
当然,您还需要以下内容。
location = /error.php {
alias /var/www/error.php;
fastcgi_index error.php;
fastcgi_pass php;
include fastcgi_params;
internal;
}
error_page 403 /error.php?e=403;