Single

纯代码完美解决WordPress管理员登录用户名暴露问题

作为一个Wordpress折腾者,几乎每个人都被一件事所烦扰,那就是暴力破解,这些机器每天不劳其烦地扫了一遍又一遍我们的登录页面,企图测试出我们博客管理员的真实登录名跟密码。但是,如果管理员的登录名暴露在评论区域呢?只要用心人轻轻松松审查一下元素,就能找到登录名,然后进行暴力破解,那事情就麻烦了。

这个问题最先是龙笑天下发现的漏洞,范围几乎涉及全部的Wordpress站点,属于Wordpress官方没有意料到的bug。针对这个漏洞,他提出了解决办法《》,方法也很简单,就是修改Wordpress程序(跟我们的主题没关系),弊端也很显著,就是每次升级Wordpress版本都要自己再修改一次。

接着,boke112提出了另外一种方法,只需要修改自身使用的主题即可,但是依旧有弊端:他的方法只适合知更鸟主题为框架或者类似知更鸟主题结构的主题()。

这里简单说一下他们分享方法的不足:

综上得知,改动有风险,修改需谨慎。然后为了解决这个问题,我想了好几个办法来分别测试,以下简单说一下:

1、重新定义get_comment_class函数(失败)

最开始,我的想法是能不能重新定义这个函数,于是将代码扒下来,修改为用户ID输出扔到functions后,发现被警告不能重复声明,然后将函数名自定义,重新测试后得到的结果:不起作用。

2、移除与增加comment_classclass(有bug

既然重新定义函数行不通,于是我又想到了能不能给comment_class新增赋予一个class值,再将原来comment_class里面的comment-author-给过滤移除掉。

结果行得通,妥妥没问题,不过发现有一个明显的问题,那就是depth这个class值无法自动判断输出(原因应该是被过滤掉了,导致无法识别它的后缀值)。

3、巧用判断函数遮掩comment_class(未知)

综上,我是失败而归,但不甘就此放弃,于是想到:既然不能根治,那么就干脆给个管理员【类似if (is_admin())的判断句】可见得了,这样别人就看不到啦。

测试的结果自然是成功了,不过因为不知道class对于SEO等是否有影响,所以我没打算采用。

4、替换comment_class的指定输出(完美解决,并附上代码)

最后嘛,睡前想到了一种可以‘瞒天过海’的取巧手段:众所周知,我们博客运行到一定阶段,有些博客不仅换主题、还会进行博客改版,而博客改版自然会涉及到新旧信息的替换。有些人采取开刀数据库,有些人借用functions函数文件遮掩替换。

所以我的思路也就是来源:批量替换文章内容的文本信息

实现的方法也很简单,只需要将以下代码扔到functions.php函数文件里面,即可完美解决因为comment_class导致管理员登录名泄漏的漏洞:

  1. //替换comment_class暴露的登录名为指定输出值——by 龙砚庭博客(http://loomob.com/)
  2. function lyt_comment_class($lyt){
  3.     $replace = array(
  4.         ‘comment-author-你的真实登录名’ => ‘comment-author-新的输出名’,
  5.     );
  6.     $lyt = str_replace(array_keys($replace), $replace$lyt);
  7.     return $lyt;
  8. }
  9. add_filter(‘comment_class’, ‘lyt_comment_class’);

切记将代码里面,该修改的代码修改好(实在不懂怎么修改,就自行审查元素,查看自己博客输出的comment-author-值)。

总结:

这个方案最大的优点就是不会破坏Wordpress结构,也不用担心因为Wordpress版本更新而再次手动去修改任何文件,更不用担心其他主题无法使用教程代码。它既顺从了comment_class的规则,又满足了我们的需求,可以说是目前最完美的处理手段。

另外,Wordpress是一个越折腾越精通的过程,希望更多的人能够分享更多实用的教程出来,这样人才能更加进步!