我正在将用户从旧数据库转移到vBulletin数据库。
我想要一个脚本来执行此操作,否则将永远这样做。
我将所有用户的密码存储起来,就像md5(密码)
一样但是,当然,由于盐等原因,这不适用于vBulletin。
所以我的代码是这样的:
<?Php
mydatabase_connect();
$select=mysql_query("SELECT * from `users`");
while($user=mysql_fetch_array($select)) {
forum_connect();
$check=mysql_query("SELECT * from `user` where `username` = '{$user[username]}'");
if(mysql_num_rows($check)>="1") {
echo "fail";
}else{
$insert=mysql_query("INSERT into `user` SET `username` = '{$user[username]}', `password` = '{$user[password]}', `email` = '{$user[email]}'");
if($insert) {
echo 'success';
}else{
echo 'fail';
}
}
mydatabase_connect();
}
?>
如何更改它以使用vBulletin - 因此我可以正确设置vBulletin用户。password
字段和vBulletin用户。salt
。请记住,我的$ user [密码]或users
。password
存储为真实文本密码的md5哈希值。
谢谢!
答案 0 :(得分:4)
我不知道这个答案是否为时已晚,但您应该能够自动将密码转移到vBulletin。
vBulletin以这种方式生成哈希:
$hash = md5(md5($plaintext) . $salt);
因此,要转移用户,请执行以下操作:
$salt = /* generate salt */;
$vb_hash = md5($your_old_hash . $salt);
为了方便自己,请使用vBulletin的盐生成方法。它位于vB_DataManager_User类中。
答案 1 :(得分:1)
如果您的旧系统使用了未加盐的哈希值,并且vBulletin使用了盐渍哈希值,那么如果您希望用户保留其密码,则必须修改vBulletin以使用未加盐的哈希值。我不熟悉vBulletin代码,但如果每个用户都有自己的salt值,也许只需将其设置为空字符串即可。
如果失败,请编写一个页面以使用户能够转换到新系统。您可以在用户登录失败时将用户定向到页面,并根据旧系统检查他们的凭据,并为新系统创建新的salt和hash。
答案 2 :(得分:0)
这对我有用
md5(md5(passowrd).salt);
答案 3 :(得分:0)
我已经调整了用于将用户信息从现有数据库传输到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`;
以下查询为每个用户添加默认条目。
如果您添加了任何自定义配置文件字段,则需要将该信息传输到用户字段表中:
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;