我已經適應我用的用戶信息從現有的數據庫轉移到vBulletin數據庫的過程。它使用通過MySQL命令行客戶端輸入的數據庫查詢,不需要PHP處理。
它適用於所概述的場景:使用md5(password)
存儲現有數據庫中的密碼。
這兩個數據庫都在同一臺服務器上,vBulletin 4。X
三個存儲功能將被創建:
vbulletin.userTitle() // Convert user type from current db to a user title
vbulletin.groupId() // Convert current user type into permission group ID
vbulletin.randomSalt() // Create salt using same approach as used by vbulletin
登錄通過MySQL客戶端: mysql --user=xxx -p vbulletin
創建存儲功能:
delimiter //
CREATE FUNCTION vbulletin.userTitle(mtype VARCHAR(255))
RETURNS CHAR(250)
NO SQL
BEGIN
DECLARE userTypeTitle CHAR(250) DEFAULT "";
CASE mtype
WHEN 'user' THEN SET userTypeTitle = 'Member';
WHEN 'admin' THEN SET userTypeTitle = 'Administrator';
WHEN 'moderator' THEN SET userTypeTitle = 'Regional Moderator';
ELSE
SET userTypeTitle = 'Member';
END CASE;
RETURN userTypeTitle;
END//
CREATE FUNCTION vbulletin.groupId(mtype VARCHAR(255))
RETURNS smallint(5)
NO SQL
BEGIN
DECLARE groupTypeId smallint(5) DEFAULT 0;
CASE mtype
WHEN 'user' THEN SET groupTypeId = 2;
WHEN 'admin' THEN SET groupTypeId = 6;
WHEN 'moderator' THEN SET groupTypeId = 11;
ELSE
SET groupTypeId = 12;
END CASE;
RETURN groupTypeId;
END//
CREATE FUNCTION vbulletin.randomSalt()
RETURNS CHAR(30)
READS SQL DATA
BEGIN
DECLARE count INT DEFAULT 0;
DECLARE rn1 CHAR;
DECLARE saltout VARCHAR(30) DEFAULT "";
WHILE count<30 DO
SET count = count+1;
SET rn1 = CHAR(FLOOR(33 + (RAND() * 93)));
SELECT CONCAT(saltout, rn1) INTO saltout;
END WHILE;
RETURN saltout;
END//
delimiter ;
在傳輸用戶信息之前備份數據庫。
vbulletin數據庫包含設置和測試過程中使用的所有信息,因此清空我們將要更新的三個表。
TRUNCATE `vbulletin`.`user`;
TRUNCATE `vbulletin`.`userfield`;
TRUNCATE `vbulletin`.`usertextfield`;
修改下面的查詢使用現有的數據庫和它的相關領域。
填寫主用戶表。
鹽是通過現有用戶表中每行的存儲函數生成的。
從現有的數據庫中的哈希密碼散列與鹽當它插入到vBulletin數據庫是這樣的:
MD5(current_hashed_password + new_salt)
主查詢:
INSERT INTO `vbulletin`.`user` (
`userid`, `username`, `salt`, `password`, `email`, `passworddate`, `styleid`, `showvbcode`, `joindate`, `lastvisit`, `lastactivity`, `reputationlevelid`, `timezoneoffset`, `usergroupid`, `usertitle`
)
SELECT
`current_userid`, `current_username`, vbulletin.randomSalt() as new_salt, MD5(current_hashed_password + new_salt), `current_email`, CURDATE(), 5, 2, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 5, 0, vbulletin.groupId(current_type), vbulletin.userTitle(current_type)
from `current_database`.`user`;
下面的查詢添加默認每個用戶的條目。
如果您添加任何自定義配置文件字段,你要這些信息傳輸到userfield表:
INSERT INTO `vbulletin`.`userfield` (
`userid`, `field5`, `field6`
)
SELECT
`current_userid`, `firstname`, `lastname`
from `current_database`.`user`;
INSERT INTO `vbulletin`.`usertextfield` (
`userid`
)
SELECT `current_userid`
from `current_database`.`user`;
設置信譽級別爲您的管理員組的用戶:
UPDATE `vbulletin`.`user` SET `reputationlevelid` = 1 WHERE `usergroupid` = 6;
刪除存儲的功能,它們將不會再次使用:
DROP FUNCTION vbulletin.userTitle;
DROP FUNCTION vbulletin.groupId;
DROP FUNCTION vbulletin.randomSalt;
由於vbulletin和其他漏洞使用了非常薄弱的密碼哈希計劃,我認爲您應該假設所有這些密碼都已被破解,並強制所有用戶升級其密碼。鑑於這些實踐似乎有多糟糕,您可能希望切換到由瞭解和關心安全性更多的人編寫的論壇軟件。見例如[vBulletin密碼黑客燃料恐懼嚴重的互聯網範圍內的0天攻擊| Ars Technica](http://arstechnica.com/security/2015/11/vbulletin-password-hack-fuels-fears-of-serious-internet-wide-0-day-attacks/) – nealmcb 2016-02-13 21:19:05