我已经适应我用的用户信息从现有的数据库转移到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