MySQL для авторизации пользователя из учетной записи IPBoard
Недавно я приобрел программное обеспечение для 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 - это sdk для php, разработанный для этой игры (чтобы иметь возможность отправлять и получать информацию из игры, используя внешние php-скрипты.
Может быть, это не обычный вопрос. Я пытался объяснить это как можно лучше, потому что я знаю, что ты не привыкнешь к этой игре и как она работает.
заранее спасибо
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();
}
и т. д.
С учетом вышесказанного вы должны, по крайней мере, иметь возможность увидеть, в чем именно заключается ошибка, и уметь с ней бороться.