【问题标题】:Nginx deny GET methodNginx 拒绝 GET 方法
【发布时间】:2019-07-22 16:59:03
【问题描述】:

通过 url wp-login.php?action=register 向我的 WP 网站发送大量机器人请求以创建垃圾用户。我想使用 Nginx 阻止所有这些

我已尝试在此帖子https://stackoverflow.com/a/48614915/6563638 之后申请以下conf

location = /wp-login.php {
       if ( $args ~ ^action=register ) {
               return 403;
       }
}

location / {
        try_files $uri $uri/ /index.php?$args;
}

wp-login.php?action=register 的所有请求都已成功返回403。但现在对wp-login.php 的其他请求完全是文件下载请求。我无法将它们传递给 PHP CGI 来执行。

有人解决了这个问题吗?

【问题讨论】:

标签: wordpress nginx


【解决方案1】:

我从这里 https://gist.github.com/jrom/1760790 找到了一个干净清晰的解决方案。尽管使用map 关注该帖子中的cmets 会更简短和优雅,但我发现尝试使用if 语句可以更好地理解“如果是邪恶的”。

这是我的 WP 网站的配置文件

server {
    listen   80;
    server_name  ....;
    root   ...;
    index index.php;
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    if ( $request_filename = "${document_root}/wp-login.php" ) {
        set $login "1";
    }

    if ( $arg_action = "register") {
        set $login "${login}2";
    }

    if ( $login = "12" ){
        return 403;
    }

    location /portal/ {
                try_files $uri $uri/ /portal/index.php?$args;
        }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_buffer_size 256k;
                fastcgi_buffers 4 256k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

【讨论】:

    【解决方案2】:

    1. 为什么不直接禁用新用户的注册?这是您可以在 WordPress 仪表板 > 设置中找到的最简单方法。即使您更改了服务器,这也会保留。想象一下你将来改用 Apache。

    2.你的Nginx的规则看起来不错,但是有两个问题:

    • 要传递给 PHP FastCGI 的 .php 文件的 location 块在哪里?是只发生在 wp-login.php 还是所有其他 .php 文件上?
    • 不要只匹配以action=register 开头的参数。我可以将请求更改为?s=1&action=register 并完成。 (s 对 WordPress 不做任何事情,只是绕过你的规则)。

    3. 请勿编辑任何 WordPress 核心文件链接 @num8er 的建议。您的更改肯定会通过 WordPress 更新恢复。但是你也应该通过以下规则阻止它们:

    location = /xmlrpc.php {
        deny all;
        access_log off;
        log_not_found off;
    }
    

    【讨论】:

    • 我同意你的建议,我只是想知道是否有任何方法可以配置 Nginx 以完全阻止具有特定参数(GET 或 POST 方法)的 URL。 PHP FasCGI 位置块就在根目录的正下方,我正在为 Wordpress 使用标准的 Nginx conf
    猜你喜欢
    • 1970-01-01
    • 2016-11-02
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2020-08-25
    • 2021-12-27
    • 2021-03-27
    相关资源
    最近更新 更多