一般而言, phpBB 使用者在申請會員帳號時, 所輸入的密碼,
在輸入資料庫前, 都有經過 md5() 加密處理;
也就是說, 就連系統管理員, 也很難從資料庫裡頭, 去窺見會員的密碼.
如果會員忘記密碼, 那麼他可以申請一組隨機密碼;
或者, 請管理員由論壇控制台 (會員管理) 更新其密碼.
這是為了保障會員權益而精心設計的機制!
然而, 經常發現部分網友似乎有移除 md5() 的需求?
這部分的動機, 的確啟人疑竇.
如果您確實是有移除 md5() 的正當需求, 那麼本文的作法, 可以提供您參考.
<< phpBB 2.0.x >>
<方法一>
直接移除 md5() 加密處理;
也就是說, 讓會員的密碼, 直接以原貌存入資料庫.
#
#-----[ OPEN ]-----
#
admin/admin_users.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
$password = md5($password);
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
$password = $password;
#-----[ OPEN ]-----
#
includes/usercp_sendpasswd.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
$sql = "UPDATE " . USERS_TABLE . "
SET user_newpasswd = '" . md5($user_password) . "', user_actkey = '$user_actkey'
WHERE user_id = " . $row['user_id'];
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
$sql = "UPDATE " . USERS_TABLE . "
SET user_newpasswd = '$user_password', user_actkey = '$user_actkey'
WHERE user_id = " . $row['user_id'];
#-----[ OPEN ]-----
#
includes/usercp_register.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
if ( $row['user_password'] != md5($cur_password) )
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
if ( $row['user_password'] != $cur_password)
#-----[ FIIND ]-----
#
代碼: 選擇全部
$new_password = md5($new_password);
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
$new_password = $new_password;
#-----[ FIIND ]-----
#
代碼: 選擇全部
if ( $row['user_password'] != md5($cur_password) )
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
if ( $row['user_password'] != $cur_password)
#-----[ OPEN ]-----
#
login.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
if( md5($password) == $row['user_password'] && $row['user_active'] )
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
if( $password == $row['user_password'] && $row['user_active'] )
#-----[ SAVE & CLOSE ]-----
#
<方法二>
新增一個欄位, 記錄原始的密碼;
無論是會員註冊時, 輸入之密碼, 或者是修改個人資料, 更新之密碼, 都會記錄原始的密碼.
#
#-----[ SQL ]-----
#
代碼: 選擇全部
ALTER TABLE phpbb_users ADD user_password_2 VARCHAR(32) NOT NULL AFTER user_password
#-----[ OPEN ]-----
#
admin/admin_users.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
$password = md5($password);
$passwd_sql = "user_password = '$password', ";
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
$user_password_2 = $password;
$password = md5($password);
$passwd_sql = "user_password = '$password', user_password_2 = '$user_password_2', ";
#-----[ OPEN ]-----
#
includes/usercp_sendpasswd.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
$sql = "UPDATE " . USERS_TABLE . "
SET user_newpasswd = '" . md5($user_password) . "', user_actkey = '$user_actkey'
WHERE user_id = " . $row['user_id'];
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
$sql = "UPDATE " . USERS_TABLE . "
SET user_newpasswd = '" . md5($user_password) . "', user_password_2 = '$user_password', user_actkey = '$user_actkey'
WHERE user_id = " . $row['user_id'];
#-----[ OPEN ]-----
#
includes/usercp_register.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
if ( !$error )
{
$new_password = md5($new_password);
$passwd_sql = "user_password = '$new_password', ";
}
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
if ( !$error )
{
$user_password_2 = $new_password;
$new_password = md5($new_password);
$passwd_sql = "user_password = '$new_password', user_password_2 = '$user_password_2', ";
}
#-----[ SAVE & CLOSE ]-----
#
DEMO: << phpBB 3.0.x >>
<方法一>
直接移除 phpbb_hash() 加密處理;
也就是說, 讓會員的密碼, 直接以原貌存入資料庫.
(略)
ps.
個人以為, 第二種方法較適宜;
若有興趣, 則可參考前面文章自行修改.
<方法二>
新增一個欄位, 記錄原始的密碼;
無論是會員註冊時, 輸入之密碼, 或者是修改個人資料, 更新之密碼, 都會記錄原始的密碼.
#
#-----[ SQL ]-----
#
代碼: 選擇全部
ALTER TABLE phpbb_users ADD user_password_2 VARCHAR(40) NOT NULL AFTER user_password
#-----[ OPEN ]-----
#
includes/acp/acp_users.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
'user_password' => phpbb_hash($data['new_password']),
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
'user_password' => phpbb_hash($data['new_password']),
'user_password_2' => $data['new_password'],
#-----[ OPEN ]-----
#
includes/ucp/ucp_profile.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
'user_password' => ($auth->acl_get('u_chgpasswd') && $data['new_password']) ? phpbb_hash($data['new_password']) : $user->data['user_password'],
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
'user_password' => ($auth->acl_get('u_chgpasswd') && $data['new_password']) ? phpbb_hash($data['new_password']) : $user->data['user_password'],
'user_password_2' => $data['new_password'],
#-----[ OPEN ]-----
#
includes/ucp/ucp_register.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
'user_password' => phpbb_hash($data['new_password']),
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
'user_password' => phpbb_hash($data['new_password']),
'user_password_2' => $data['new_password'],
#-----[ OPEN ]-----
#
includes/ucp/ucp_remind.php
#
#-----[ FIIND ]-----
#
代碼: 選擇全部
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_newpasswd = '" . $db->sql_escape(phpbb_hash($user_password)) . "', user_actkey = '" . $db->sql_escape($user_actkey) . "'
WHERE user_id = " . $user_row['user_id'];
#-----[ REPLACE WITH ]-----
#
代碼: 選擇全部
$sql = 'UPDATE ' . USERS_TABLE . "
SET user_newpasswd = '" . $db->sql_escape(phpbb_hash($user_password)) . "', user_password_2 = '" . $db->sql_escape($user_password) . "', user_actkey = '" . $db->sql_escape($user_actkey) . "'
WHERE user_id = " . $user_row['user_id'];
#-----[ SAVE & CLOSE ]-----
#
DEMO: 後記
方法一, 較適用全新的論壇, 否則已經登錄的密碼, 恐怕全部失效, 只得請舊會員申請隨機密碼;
方法二, 則無此限制, 只是已經登錄的密碼, 除非舊會員自行再做更新, 否則依然無法知其原貌.
總之, 除非必要, 否則不太建議您 (管理員) 做此修改.
換個角度想: 當您發現原本正常使用的論壇, 要求您更新密碼的時候, 請您務必三思!

--
參考資料:
1. 什麼是 md5() ?
http://a-010.cyut.edu.tw/~vote/md5.php
2. 什麼是 phpbb_hash() ?
http://www.phpbb.com/community/viewtopi ... 6&t=894235