在 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
的操作了。