我正在使用Sucuri Scanner通知我登录尝试失败,我目前每天收到大约50封以上的电子邮件。我已经尝试了几种不同的方法来阻止访问 wp-login.php 和 wp-admin 而没有任何运气,因为我认为这些规则可能不会使用子域(或通常只是吮吸)。
server {
# Primary domain, secondary domain and subdomains are explicitly
# declared so that I can generate certs using CertBot
server_name primarydomain.com
secondarydomain.com
subdomain1.primarydomain.com
subdomain2.primarydomain.com
subdomain3.primarydomain.com;
client_max_body_size 20M;
root /home/username/www/primarydomain.com/public_html;
index index.php;
error_log /home/username/www/primarydomain.com/logs/error.log error;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
# This doesn't seem to block access
location /wp-login.php {
allow XXX.XXX.XXX.XXX; # this is my ipaddress
deny all;
}
# This doesn't seem to block access
location /wp-admin/ {
deny all;
allow XXX.XXX.XXX.XXX; # this is my ipaddress
}
# This doesn't seem to block access
location ~ ^/(wp-admin|wp-login\.php) {
deny all;
allow XXX.XXX.XXX.XXX; # this is my ipaddress
}
}
答案 0 :(得分:7)
它无法正常工作,因为regexps
的更高优先级比nginx
https://nginx.ru/en/docs/http/ngx_http_core_module.html#location
要查找与给定请求匹配的位置,nginx首先检查 使用前缀字符串(前缀位置)定义的位置。其中 它们,选择具有最长匹配前缀的位置 记住了。
这就是重点:
然后按照它们的出现顺序检查正则表达式 在配置文件中。搜索正则表达式 终止于第一个匹配,相应的配置是 用过的。如果找不到与正则表达式匹配的话 使用前面记住的前缀位置的配置
所以这个表达式会处理所有请求
location ~ \.php$
其中一个解决方案可能是将您的prefix
位置转换为regexp并在配置文件中向上移动
或者对您要限制访问的网址使用=
修饰符
此外,使用“=”修饰符可以定义完全匹配 的URI和位置。如果找到完全匹配,则搜索终止
来自文档的更多示例:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
“/”请求将匹配配置A,即“/index.html”请求 将匹配配置B,“/documents/document.html”请求 将匹配配置C,“/ images / ..gif”请求将匹配 配置D,“/documents/1.jpg”请求将匹配 配置E
答案 1 :(得分:3)
请尝试使用自定义登录网址和iTheme security plugin插件google recaptcha。它可以在一定程度上减少攻击。一个月前我们在我们的网站上遭到了如此多的攻击,但现在它很好,它减少到2 /周到零。
答案 2 :(得分:2)
最简单的解决方法是使用嵌套位置
http{
server {
server_name *.domain.com;
listen 80;
location ~ \.php$ {
location ~ /wp-login\.php$ {
deny all;
}
location ~ ^/wp-admin/ {
deny all;
}
return 200 "OK";
}
}
测试结果如下
$ curl vm/testing.php
OK%
$ curl vm/wp-login.php
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty/1.11.2.2</center>
</body>
</html>
$ curl vm/wp-admin/index.php
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty/1.11.2.2</center>
</body>
</html>