Php MySQL从IPBoard帐户授权用户

Php MySQL从IPBoard帐户授权用户,php,mysql,sql,single-sign-on,invision-power-board,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 data

我最近为我的游戏社区购买了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]);
其他价值观是游戏正在使用的东西,而不是游戏所需要的

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

我尝试了许多不同的方法,但总是得到相同的错误消息,而不是散列

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

我所说的游戏是Multi-Theft Auto,是对GTA:SA(也许有人知道)的多人修改,它使用LUA作为脚本

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

也许这不是一个惯例性的问题。我尽量解释得更好,因为我知道你不会习惯这个游戏,它是如何运作的


提前感谢

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

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

$debug_txt = fopen('debug.txt', 'w');
fwrite($debug_tx, $error_here);
fclose($debug_tx);
要在这里获取$error_,最简单的方法就是加入几个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();
}
等等


有了以上内容,您至少应该能够看到错误的具体内容,并能够与之抗争。

除了潜在的SQL注入和使用古老的
mysql\u*
,我看不到您的代码中有任何明显的错误(尽管我不熟悉Multi-Theft Auto,也没有对这些方面做出任何声明)。可能SQL没有返回任何记录-您没有检查它是否返回记录?请尝试在另一个MySQL客户端中测试
$SQL
的值。我在phpmyadmin中测试了SQL查询,它正在工作(刚刚用我正在测试的示例替换了变量,它是sameYes,但是
$sql
变量是否真的包含了您期望的sql?请尝试将其输出到某个地方进行调试。很抱歉在过了很长时间后接受了您的答案,但这确实帮助我获得了所需的内容。谢谢。
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();
}