nginx拒绝POST到wp-login.php,除非在同一页面上

时间:2017-10-08 13:16:08

标签: wordpress nginx

我注意到我的wp-login.php远程POST命令的上升(主要是尝试重置密码)。虽然我已经防止了欺骗回复地址,但我收到这些仍然很烦人。因此,查看日志,我注意到这些请求都是发送POST命令的远程站点:

POST /wp-login.php?action=lostpassword HTTP/1.1" 302 5 "-" "-"

所以我想要做的是配置nginx来阻止任何不是来自wp-login.php页面本身点击的丢失密码链接的POST命令。这可能吗?

我首先尝试使用以下内容(在Wordpress网站上建议),但它不会阻止访问该页面(在POSTMAN中测试):

location ~* (wp-comments-posts|wp-login)\.php$ {
        if ($http_referer !~ ^(https://example.com) ) {
          return 405;
        }
      }

然后,注意到我在该文件中有另一个块:

location = /wp-login.php {
  limit_req zone=one burst=1 nodelay;
  include fastcgi_params;
  fastcgi_pass php7;
}

我尝试按以下方式修改它:

location = /wp-login.php {
  limit_req zone=one burst=1 nodelay;
  include fastcgi_params;
  fastcgi_pass php7;

  if ($http_referer !~ ^(https://example.com) ) {
          return 405;
        }

}

但这会阻止所有人,即使在浏览器中,这也不是我想要的。是否有办法阻止任何未来自浏览器中wp-login.php上丢失密码链接的人访问wp-login.php?action=lostpassword

1 个答案:

答案 0 :(得分:0)

推荐人很容易被欺骗,而且通常是不可行的,请不要将其用于安全目的。

而是使用插件重命名URL以进入登录。将/wp-login.php更改为/ letMeIn /或/ MyLogin /。它很容易告诉你的用户,它可以让随机机器人完全找出弱密码。

我很确定您甚至可以在您的网站上添加指向您的非标准登录URI的链接,但仍然会因更改它而受益匪浅,因为机器人不会分析您的网站,只是尝试攻击默认值WordPress安装。

有了这个,

if ($http_referer !~ "^https://example.org/") {  return 403; }

在当前的nginx上对我工作正常。如果不适合您,请使用浏览器的开发工具查看发送的实际请求以及您作为Referer发送给服务器的内容。

我还在主机名后添加了一个/(即使标题很容易伪造,这对伪造也没有帮助),以确保它不适用于https://example.org.example.com