我最近为我的游戏社区获得了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]);
?>
$input变量返回由试图玩游戏的用户提供的信息。它是一个如下所示的数组:
$input[2] - the username;
$input[3] - the password (plain text)
其他值是游戏正在使用的内容,不需要。
我成功地从游戏中调用了 php 脚本,php 正在发回信息,但它返回的哈希值是:"错误">
我尝试了许多不同的方法来做到这一点,但总是收到相同的错误消息而不是哈希。
一些可能有趣的额外信息:
我说的游戏是Multi Theft Auto,GTA:SA的多人游戏修改(也许有人知道(,它使用LUA作为脚本。
mta_sdk.php文件是为这个游戏开发的php的sdk(能够使用外部php脚本从游戏中发送和接收信息。
也许这不是一个问题。我试图尽可能地解释这一点,因为我知道你不会习惯这个游戏以及它是如何工作的。
提前致谢
我有点困惑 - 为什么要将密码存储为明文,然后使用盐将它们转换为 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();
}
等等等等。
有了上述内容,您至少应该能够看到错误到底是什么,并能够解决它。