2012-05-12 156 views
1

我最近为我的游戏社区获得IPBoard开发板软件,我将它从SMF转换而来。MySQL授权IPBoard帐户的用户

当我使用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]); 

>

$输入的是谁attemping在比赛中的发挥用户给定的变量返回的信息?它像以下的数组:

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

的其它值的东西,该游戏是使用,不需要用于此。

我成功地称之为从游戏PHP脚本,而PHP发回信息,但它返回的哈希值是:

我试着做这件事的许多不同的方式,但总是得到同样的错误“ERROR”消息而不是哈希。

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

比赛中我说的是多飞车,多人修改为GTA:SA(也许有人知道它),它使用LUA脚本的。

的mta_sdk.php文件是这个游戏开发PHP的SDK(能够发送和使用外部PHP脚本从游戏中收到的信息。

也许这不是一个convencional问题,我试着解释这更好的,因为我可以,因为我知道你不会来这个游戏,它是如何工作

在此先感谢

+1

除了潜在的SQL注入和古代'mysql_ *'的使用,在代码中我看不到任何明显的*错误*(尽管我不熟悉MultiTheft Auto并且不提供任何声明关于这些方面)。也许SQL没有返回任何记录 - 你不检查它是否?尝试在另一个MySQL客户端中测试'$ sql'的值。 – eggyal

+0

我在phpmyadmin中测试了SQL查询并且它正在工作(刚刚用我正在测试的示例替换变量,并且它是相同的 – Karevan

+0

是的,但'$ sql'变量实际上是否包含您期望的SQL?尝试输出它在某个地方用于调试 – eggyal

回答

1

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

尝试回显一些数据到网页,或将其存储在调试文本文件中;一个简单的方法就是在你的服务器上建立一个文本文件,将它改为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(); 
} 

等等

有了以上这些,你至少应该能够看到错误究竟是什么,并且能够对付它。

+0

很抱歉在很长时间后接受您的答案,但这确实帮助我获得了我所需要的东西,谢谢。 – Karevan