在 Discuz! / Discuz! X 之前的版本中,大家总是能碰到一个提示,就是密码错误次数过多,需要等 15 分钟才能登陆的情况。

如果是在局域网内有很多人去登陆论坛,因为出口 IP 是一个,这种情况会更多的发生。

因为在之前的版本中,这里的记录是会记录某个 IP 登陆错误的次数,超过 15 分钟后就会导致这个情况发生。

在 X2.0 版本中,这里做了调整,不在只针对 IP 做错误限制,会同时记录输入错误密码时所使用的用户名。

X2.0 的用户登陆相关的处理在 /soucr/class/class_member.php 文件中

登陆时候,我们调用的是该类中的 on_login 方法:

在该方法中会做登陆相关的处理,在这个方法的后面,有一行代码:

  1. loginfailed($_G['gp_username']);

其中 loginfailed 函数在 /source/function/function_member.php 中

我们看到这个函数是:

  1. function loginfailed($username) {
  2.         global $_G;
  3.         $username = addslashes(trim(stripslashes($username)));
  4.         DB::query("UPDATE ".DB::table('common_failedlogin')."
    SET count=count+1, lastupdate='$_G[timestamp]' WHERE ip='$_G[clientip]'
    AND username='$username'");
  5. }

这个函数会把错误记录到表 pre_common_failedlogin 中,如果我们再次遇到某个用户登陆错误次数过多导致需要等 15
分钟才能登陆时,需要手动清表信息的时候,可以在这里根据 username   字段删除其登陆错误记录即可,而不在需要之前直接清空 整个  IP
的操作了。