MySQL从IPBoard帐户授权用户

时间:2012-05-12 14:47:56

标签: php mysql sql single-sign-on invision-power-board

我最近为我的游戏社区获得了IPBoard板卡软件,我将其转换为SMF。

当我使用smf时,我使用了一个系统来授权玩家在我的游戏服务器中注册,这个脚本称为一个php脚本,它对玩家在游戏中输入的密码进行了哈希(sha1)并将其发回给了在游戏中运行的脚本。然后,在让他玩之前,我检查了玩家是否在论坛中注册了。好吧,IPBoard使用不同的哈希:

$hash = md5( md5( $salt ) . md5( $password ) );

其中:

$hash is the value stored in the database column members_pass_hash.
$salt is the value stored in the database column members_pass_salt.
$password is the plaintext password.

我正在尝试的是制作一个PHP脚本,它将在游戏中返回正确的哈希值,我将在稍后从游戏中将其与数据库进行比较。这是我的代码:

    <?php

include("mta_sdk.php");
$input = mta::getInput();

 // Configuración de la aplicación

$DB_SERVIDOR = 'localhost:3306';

$DB_USUARIO = 'root';

$DB_CLAVE = 'xxx';

$DB_BASEDATOS = 'ipboard';

$conexion = mysql_connect($DB_SERVIDOR, $DB_USUARIO, $DB_CLAVE);

mysql_select_db($DB_BASEDATOS, $conexion);

mysql_query("SET NAMES 'utf8'");


$sql = "SELECT members_pass_salt FROM ipb_members WHERE name = '".$input[2]."'";

$Res = mysql_query($sql, $conexion);

$rowRes = mysql_fetch_assoc($Res);


$salt = $rowRes['members_pass_salt']
$hash = md5( md5( $salt ) . md5( $input[3] ) );
//$hash = $salt;
// Return encrypted string using MD5
mta::doReturn($hash,$input[1],$input[2],$input[3],$input[4]);

&GT;

$ input variable返回正在尝试在游戏中玩的用户给出的信息。它是一个如下数组:

$input[2] - the username; 
$input[3] - the password (plain text)

其他值是游戏正在使用的东西,不需要它。

我成功地从游戏中调用了PHP脚本,并且php正在发回信息,但它返回的哈希是:“ERROR”

我尝试了很多不同的方法,但总是得到相同的ERROR消息而不是哈希。

可能有趣的一些额外信息:

我正在谈论的游戏是Multi Theft Auto,一个针对GTA的多人游戏修改:SA(也许有人知道)并且它使用LUA作为脚本。

mta_sdk.php文件是为此游戏开发的php的sdk(能够使用外部php脚本从游戏中发送和接收信息。

也许这不是一个传统的问题。我试着尽可能地解释这个,因为我知道你不会习惯这个游戏以及它是如何工作的。

提前致谢

1 个答案:

答案 0 :(得分:2)

我有点困惑 - 为什么要将密码存储为明文,然后使用盐将其转换为md5?如果我错了,请原谅我,但这似乎不是一个非常明智的做法。

尝试将一些数据回显到网页,或将其存储在调试文本文件中;一个简单的方法是在你的服务器上设置一个文本文件,chmod到777,并包含这个代码写出来;

$debug_txt = fopen('debug.txt', 'w');
fwrite($debug_tx, $error_here);
fclose($debug_tx);

要获取$ error_here,最简单的方法就是抛出一些if语句。即:

if (mysql_select_db($DB_BASEDATOS, $conexion))    
{    
$sql = "SELECT members_pass_salt FROM ipb_members WHERE name = '".$input[2]."'";    
$Res = mysql_query($sql, $conexion); 
// Write out the results to the debugger
// Use a foreach loop with mysql_fetch_assoc if there might be more than one entry.
}
else
{
$error_here = mysql_error();
}

等等。

通过上述内容,您至少应该能够看到错误是什么,并且能够对抗它。