1

最近、ゲーム コミュニティ用に 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 スクリプトを使用してゲームから情報を送受信できるようにするため)。

たぶん、これは従来の質問ではありません。あなたがこのゲームとその仕組みに慣れていないことを知っているので、私はこれをできる限りうまく説明しようとしました.

前もって感謝します

4

1 に答える 1

2

私は少し混乱しています - パスワードをプレーンテキストとして保存し、ソルトを使用して md5 に変換するのはなぜですか? 間違っていたらすみませんが、それはあまり賢明なアプローチとは思えません。

一部のデータを Web ページにエコー バックするか、デバッグ テキスト ファイルに保存してみてください。これを行う簡単な方法は、サーバー上にテキスト ファイルをセットアップし、それを 777 に chmod し、このコードを含めて書き出すことです。

$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();
}

などなど

上記を使用すると、少なくともエラーが正確に何であるかを確認し、それと戦うことができるはずです。

于 2012-06-24T23:54:13.977 に答える