kn007的个人博客
♥ You are here: Home > > > 如何保护WordPress的wp-login.php和wp-cron.php

如何保护WordPress的wp-login.php和wp-cron.php

by | 71 Comments

secure-site-from-hackers
下面就简单以CentOS和Nginx说下,如何保护Wordpress的wp-login.php和wp-cron.php,最后会说说/wp-admin/install.php。

wp-login.php是我们Wordpress的登录文件,wp-cron.php使我们的Wordpress的定时任务执行触发文件。

首先,对于wp-login.php,可以利用Nginx做了个验证,如下操作:

1.利用htpasswd,生成帐号和密码文件,如下命令:

#下面命令生成密码,其中admin是用户名(回车后会要求你输入密码):
htpasswd -c /usr/local/nginx/passwd_kn007.db admin

2.在你域名conf中,引入验证,比如kn007.net.conf中,在其他location之前,再加多下面的语句:

location ~ ^/wp-login\.php {
	auth_basic "kn007's Auth System";
	auth_basic_user_file /usr/local/nginx/passwd_kn007.db;
	location ~ .*\.php?$ {
		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php-cgi.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
	}
}

为什么要在里面重新匹配PHP呢,因为如果不的话,就变成文件下载了。。。

这样做,可能对大家平时访问带来了不便。但是这样是安全的,算是两步验证了,对于那些暴力破解什么的,完全有效,不管你是get还是post,都是返回401,你必须按正规渠道来,才能访问。而且毕竟是Nginx作为前端,其抗压能力,非常出众,不在话下,如果配合Fail2Ban的话,那就是倍儿爽。

接下来说说wp-cron.php,现在Wordpress越来越成熟了,也没出现过自动文章发不出,超时什么的问题了。而且完全按照你Wordpress的任务时间去访问,非常高效。但是这个文件也可以被外部访问,每次访问都会检查数据库的定时列表,需不需要做一些定时任务,大并发会导致PHP和MySQL的极高的负载,非常没有必要。

即便是你在wp-config.php禁用Cron,你也会在系统的crontab加入一个访问任务,来访问wp-cron.php,达到定时任务执行的效果。(以前这个方法挺好的,因为定时任务经常各种原因,没有被执行,现在不会了。所以没什么必要),外部可以访问,你照样还是要挂。

怎么办呢?我是直接屏蔽外部访问,仅允许服务器自身访问(因为Wordpress执行任务的时候,就是在服务器上请求的)。跟上面操作一样,也是在你的域名conf下,添加下面语句:

location ~ ^/wp-cron\.php {
	allow 127.0.0.1;#本地IP
	allow 162.250.97.124;#服务器IP
	deny all;
	location ~ .*\.php?$ {
		try_files $uri =404;
		fastcgi_pass  unix:/tmp/php-cgi.sock;
		fastcgi_index index.php;
		include fastcgi.conf;
	}
}

这样就ok了。怎么样,简单粗暴,解决问题。

以上如果通过Varnish就更简单省事了,Varnish可以在内存里直接伪造个相同页面,这里就不细说。

附带说一句,可以考虑在自己VPS安装VNC,然后对一些地址限制为仅限内部访问。比如Wordpress的安装文件(/wp-admin/install.php),安装的时候,上服务器的浏览器上安装,安全,节省性能。

现在的Wordpress的安装文件(/wp-admin/install.php)一样很傻,如果你不才去上面措施,那么建议安装后,禁止访问吧。只要:

location ~ ^/wp-admin/install\.php {
	deny all;
	log_not_found off;
	access_log off;
}

为什么不直接删除呢,因为每次Wordpress更新后,都有这货。。。

至于为什么屏蔽,原因就是,访问它,它会读取内部cache(一般在MySQL,如果你没转移的话),如果不存在,读取MySQL数据库,确认安装,返回安装完毕,设置cache(同样,如果没有外部Cache,那么就在MySQL里面)。如果没安装,就给你安装,配置WP。

这里面产生的数据库访问,最少一次。外部Cache,至多一次。但一般很多人都没有外部存储做Cache,大并发时总归要消耗性能的。而且这个文件也是首次安装才有用。没什么必要。当然,如果你用了外部存储来做Cache(比如Memcache),你可以不考虑这个因素。

Wordpress比较主要的被攻击点就是这3个地方。怎么防护,简单的说到这。

转载请注明转自:kn007的个人博客的《如何保护WordPress的wp-login.php和wp-cron.php

donate
有所帮助?

Comments

71 Comments立即评论
Loading...
  1. 回复

    这方法感觉很高端,不敢乱修改

    1. MOD回复

      @小二苘: 没啥危险的 :razz:

  2. 看不懂

    1. MOD回复

      @鬼娃娃: 。。。不指望你

  3. 第一条我经常用来加密文件夹,简单防护用的

    1. MOD回复

      @zwwooooo: 对付机器人简单粗暴

    2. @kn007: 楼上大叔好,呵呵 :)

    3. MOD回复

      @郑永: 你at错了

  4. 回复

    个人博客来给你留言啦,欢迎回访个人博客

    1. MOD回复

      @顾建伟: 额,已回

  5. 回复

    ···· 我不会 :shock:

    1. MOD回复

      @Me.稀奇: :o :o 依样画葫芦

  6. 回复

    删了,要再上传

    1. MOD回复

      @1403556905: 删了wp更新的时候就会补上

  7. 回复

    我不敢修改… :twisted:

    1. MOD回复

      @CK: 额,好吧

  8. 一直没找到你所说的域名conf文件,一般应该怎么去找?

    1. MOD回复

      @街头诗人: nginx的配置文件就是啊。 :o

  9. 回复

    大神,看了你的文章受益匪浅啊!但是我的站,最近总被人get这个文件/wp-admin/admin-ajax.php,然后网站各种卡啊!CPU飙到100%……有办法解决么?!

    1. MOD回复

      @Yephy: 看你博客当论坛使了 :mrgreen:
      这个问题,还真没注意过,我回头test一下。
      还有没有其他容易被攻击的文件,说一下。我看看。

    2. MOD回复

      @Yephy: 试了下,确实把自己搞垮了 :x 这个你登录后台就要用到的。。比较麻烦,我想想

    3. MOD回复

      @Yephy: 看了下,搞垮的原因不是因为admin-ajax.php。
      我做了压力测试,貌似没什么问题,对方是怎么get或post的呢?

    4. MOD回复

      @Yephy: 一个办法就是判断请求/wp-admin/admin-ajax.php,是否带login cookie。比如我现在加上了。

    5. MOD回复

      @Yephy: 上面说的方法会导致某些插件或者代码无法工作,因为部分人会使用原生的admin-ajax.php来完成ajax动作。

    6. 回复

      @kn007: 就在刚刚,我的站,有一次遭遇了攻击……

    7. 回复

      @kn007: 2016-03-26 15时,拦截CC攻击最多,共计 1,830 次;至今累计拦截CC攻击 15,273 次;攻击最多的URL是 /wp-admin/admin-ajax.php,共计 15,273 次

    8. MOD回复

      @Yephy: 我最不怕的就是CC了 :mrgreen:

    9. 回复

      @kn007: 经过测试,我发现了原因,攻击者在我的登录页面,无限使用随机的帐号密码刷新登录,才导致的!~

    10. 回复

      @kn007: 我的另一个站,有登录错误发送邮件的通知功能,今天一样被攻击了,邮箱收到了400+封邮件……

    11. MOD回复

      @Yephy: 那你可以先对wp-login.php进行验证,不行,在考虑admin-ajax.php。

      对于admin-ajax.php,因为我前端是Varnish,很容易挡掉。

      对于nginx要用if,比较麻烦。

      我的建议还是用回文章的方法,类似这样,反正只要验证一次就好了。

      location ~ ^/wp-admin/admin-ajax\.php {
      	auth_basic "kn007's Auth System";
      	auth_basic_user_file /usr/local/nginx/passwd_kn007.db;
      	location ~ .*\.php?$ {
      		try_files $uri =404;
      		fastcgi_pass  unix:/tmp/php-cgi.sock;
      		fastcgi_index index.php;
      		include fastcgi.conf;
      	}
      }

      你试试看。

    12. 回复

      @kn007: 嗯嗯 谢谢大神!

    13. 回复

      @kn007: 话说我是LNMP,没有装Apache :x 该如何执行htpasswd? :o :o :o

    14. MOD回复

      @Yephy: 你可以
      1.安装Apache,不启用就行了。。。
      2.在线版htpasswd
      3.使用php版、python版、已编译二进制版等等
      ...

    15. 回复

      @kn007: 好吧 我网上找找 :o

    16. MOD回复

      @Yephy: 国外:
      http://www.htaccesstools.com/htpasswd-generator/
      国内:
      http://tool.oschina.net/htpasswd

      以后,我也弄一个在线版。。。

  10. 耶~不用WP 已经木有这种烦恼~

    1. MOD回复

      @Leyar: :o 得瑟

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif