提醒:本文最后更新于 3329 天前,文中所描述的信息可能已发生改变,请仔细核实。

下面就简单以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》

这方法感觉很高端,不敢乱修改
@小二苘: 没啥危险的
看不懂
@鬼娃娃: 。。。不指望你
第一条我经常用来加密文件夹,简单防护用的
@zwwooooo: 对付机器人简单粗暴
@kn007: 楼上大叔好,呵呵 :)
@郑永: 你at错了
个人博客来给你留言啦,欢迎回访个人博客
@顾建伟: 额,已回
···· 我不会
@Me.稀奇:
依样画葫芦
删了,要再上传
@1403556905: 删了wp更新的时候就会补上
我不敢修改…
@CK: 额,好吧
一直没找到你所说的域名conf文件,一般应该怎么去找?
@街头诗人: nginx的配置文件就是啊。
大神,看了你的文章受益匪浅啊!但是我的站,最近总被人get这个文件/wp-admin/admin-ajax.php,然后网站各种卡啊!CPU飙到100%……有办法解决么?!
@Yephy: 看你博客当论坛使了
这个问题,还真没注意过,我回头test一下。
还有没有其他容易被攻击的文件,说一下。我看看。
@Yephy: 试了下,确实把自己搞垮了
这个你登录后台就要用到的。。比较麻烦,我想想
@Yephy: 看了下,搞垮的原因不是因为admin-ajax.php。
我做了压力测试,貌似没什么问题,对方是怎么get或post的呢?
@Yephy: 一个办法就是判断请求/wp-admin/admin-ajax.php,是否带login cookie。比如我现在加上了。
@Yephy: 上面说的方法会导致某些插件或者代码无法工作,因为部分人会使用原生的admin-ajax.php来完成ajax动作。
@kn007: 就在刚刚,我的站,有一次遭遇了攻击……
@kn007: 2016-03-26 15时,拦截CC攻击最多,共计 1,830 次;至今累计拦截CC攻击 15,273 次;攻击最多的URL是 /wp-admin/admin-ajax.php,共计 15,273 次
@Yephy: 我最不怕的就是CC了
@kn007: 经过测试,我发现了原因,攻击者在我的登录页面,无限使用随机的帐号密码刷新登录,才导致的!~
@kn007: 我的另一个站,有登录错误发送邮件的通知功能,今天一样被攻击了,邮箱收到了400+封邮件……
@Yephy: 那你可以先对wp-login.php进行验证,不行,在考虑admin-ajax.php。
对于admin-ajax.php,因为我前端是Varnish,很容易挡掉。
对于nginx要用if,比较麻烦。
我的建议还是用回文章的方法,类似这样,反正只要验证一次就好了。
你试试看。
@kn007: 嗯嗯 谢谢大神!
@kn007: 话说我是LNMP,没有装Apache
该如何执行htpasswd?

@Yephy: 你可以
1.安装Apache,不启用就行了。。。
2.在线版htpasswd
3.使用php版、python版、已编译二进制版等等
...
@kn007: 好吧 我网上找找
@Yephy: 国外:
http://www.htaccesstools.com/htpasswd-generator/
国内:
http://tool.oschina.net/htpasswd
以后,我也弄一个在线版。。。
@Yephy: 这个问题我也遇到了,每天get几十万次,你解决了吗?
耶~不用WP 已经木有这种烦恼~
@Leyar:
得瑟