1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.1.2 Скрипт регистрации

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем gerk, 15.07.2012.

Загрузка
  1. gerk

    gerk Местный

    Регистрация:
    12.05.12
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.2
    Есть ли такой скрипт регистрации которой заносит информацию о пользователе в основные таблицы (xf_user, xf_user_authenticate) и дублирует логин с зашифрованным паролем в отдельную таблицу и что бы пароль дублирующийся в другую таблицу хешировался в MD5
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Нет, наверное. Просто задача какая-то странная...
     
  3. gerk

    gerk Местный

    Регистрация:
    12.05.12
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.2
    а как-нибудь дополнительную регистрацию можно вставить?
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Так ведь вопрос в том, зачем нужна дополнительная регистрация, когда есть нормальная дефолтная регистрация, которую при необходимости можно использовать для аутентификации. Если нужно сделать мост, то смотрите уже готовые варианты, а также соответствующие темы.
     
  5. gerk

    gerk Местный

    Регистрация:
    12.05.12
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.1.2
    скрипт авторизации который я использую нормально работает только с MD5 хешированием. Так-то скрипт поддерживает хеширование от xenforo, но почему-то не работает
    Вот php код:
    PHP:
    <?php
    define
    ('INCLUDE_CHECK',true);
    include(
    "connect.php");
    include(
    "settings.php");
    $login=$_GET['user'];
    $postPass=$_GET['password'];
    $client=$_GET['client'];
    $action=$_GET['action'];
    $serial=$_GET['serial'];
    $delimiter '#';
     
    if(
    $action == 'auth' || $action == 'getpersonal' || $action == 'activatebonus' || $action == 'activatekey' || $action == 'uploadskin' || $action == 'exchange')
    if(
    auth($login,$postPass,$serial,$crypt) == false) die("Ошибка авторизации (Логин, пароль, компьютер)");
     
    if(
    $action == 'activatebonus' || $action == 'exchange' || $action == 'getpersonal')
    {
    $row mysql_fetch_assoc(mysql_query("SELECT username,balance FROM iconomy WHERE username='$login'"));
    if(
    $row['balance']) $iconregistered true;
    else 
    $iconregistered false;
    }
     
    if(
    $action == 'auth')
    {
    $sessid generateSessionId();
    $md5jar=md5(file_get_contents($client."/bin/minecraft.jar"));
    $md5lwjql=md5(file_get_contents($client."/bin/lwjgl.jar"));
    $md5lwjql_util=md5(file_get_contents($client."/bin/lwjgl_util.jar"));
    $md5jinput=md5(file_get_contents($client."/bin/jinput.jar"));
    mysql_query("UPDATE $db_table SET $db_columnSesId='$sessid' WHERE $db_columnUser = '$login'") or die (mysql_error());
    $dlticket md5($login);
    echo 
    $md5jar.'<:>'.$md5lwjql.'<:>'.$md5lwjql_util.'<:>'.$md5jinput.'<:>'.$masterversion.'<br>'
    .$dlticket.'<:>'.$login.'<:>'.$sessid.'<br>';
    $useSlash false;
    $colMods 0;
    $files scandir($client."/mods");
    for(
    $i=0$i sizeof($files); $i++)
    {
    if(
    substr($files[$i], -4) == ".zip" || substr($files[$i], -4) == ".jar")
    {
    if(
    $useSlash) echo "<:>";
    echo 
    $files[$i].":>".md5(file_get_contents($client."/mods/".$files[$i]));;
    $useSlash true;
    $colMods++;
    }
    }
    if(
    $colMods == 0) echo "nomods";
    } else
     
    if(
    $action == 'getmasterversion') echo $masterversion; else
    if(
    $action == 'getsettings') echo $launcherTitle.$delimiter.$masterversion.$delimiter.$useOnlineTheme; else
    if(
    $action == 'getserverstatus') include('status.php'); else
    if(
    $action == 'registeraccount' && $crypt == "hash_launcher")
    {
    $repass $_GET['repasswd'];
    $email $_GET['email'];
    $serial $_GET['serial'];
     
    if(empty(
    $login) || empty($postPass) || empty($repass) || empty($email)) echo 'Не все поля заполнены';
    elseif(
    ereg("[^0-9a-zA-Z_-]"$login$Txt)) echo "Логин введен не корректно";
    else
    {
    $login_proverka mysql_query("SELECT $db_columnUser FROM $db_table WHERE $db_columnUser='$login'") or (mysql_error());
    $serial_proverka mysql_query("SELECT $db_columnSerial FROM $db_table WHERE $db_columnSerial='$serial'") or (mysql_error());
    if (
    mysql_num_rows($login_proverka)) echo "Акаунт '".$login."' уже существует";
    elseif((
    strlen($login) < 4) or (strlen($login) > 15)) echo "Логин должен содержать не меньше 4 символов и не больше 15";
    elseif(
    $postPass != $repass) echo "Пароли не совпадают";
    elseif(
    mysql_num_rows($serial_proverka) && $serial != "NOT_CALCULATED" && $useMACHook) echo "С данного компьютера уже была регистрация";
    else
    {
    $cp md5($postPass);
    mysql_query("INSERT INTO $db_table ($db_columnUser,$db_columnPass,$db_columnEmail,$db_columnMoney,$db_columnSerial) VALUES('$login','$cp','$email','$initialMoney','$serial')") or die (mysql_error());
    echo 
    "success";
    }
    }
    } else
     
    if(
    $action == 'getpersonal')
    {
    $row mysql_fetch_assoc(mysql_query("SELECT $db_columnUser,$db_columnMoney,$db_columnEmail,$db_columnBonusTime FROM $db_table WHERE $db_columnUser='$login'"));
    $realmoney $row[$db_columnMoney];
    $email $row[$db_columnEmail];
     
    $realBonus $row[$db_columnBonusTime];
    $time time();
    $bonustime = (time() + 86400);
    if(
    $time $realBonus$canUseBonus "false";
    else 
    $canUseBonus "true";
     
    if(
    $iconregistered)
    {
    $row mysql_fetch_assoc(mysql_query("SELECT username,balance FROM iconomy WHERE username='$login'"));
    $iconmoney $row['balance'];
    } else 
    $iconmoney "0.0";
     
    echo 
    $realmoney."<:>".$canUseBonus."<:>".$voteUrl."<:>".$voteImageUrl."<:>".$iconmoney."<:>".$priceByIconMoney;
    } else
     
    if(
    $action == 'activatebonus')
    {
    $row mysql_fetch_assoc(mysql_query("SELECT $db_columnUser,$db_columnBonusTime FROM $db_table WHERE $db_columnUser='$login'"));
    $realBonus $row[$db_columnBonusTime];
    $time time();
    $bonustime = (time() + 86400);
    if(
    $time $realBonus) die("Вы уже получали бонус");
    if(!
    $iconregistered) die("Вас нет в базе IConomy");
    mysql_query("UPDATE iconomy SET balance = balance + $bonusSize WHERE username='$login'");
    if(
    $iconregistered)
    $row mysql_fetch_assoc(mysql_query("SELECT username,balance FROM iconomy WHERE username='$login'"));
    $iconmoney $row['balance'];
    mysql_query("UPDATE `$db_table` SET $db_columnBonusTime=$bonustime WHERE $db_columnUser='$login'");
    echo 
    "success:".$iconmoney;
    } else
     
    if(
    $action == 'activatekey')
    {
    $key $_GET['key'];
    $row mysql_fetch_assoc(mysql_query("SELECT * FROM `$db_tableMoneyKeys` WHERE `$db_columnKey` = '$key'"));
    $amount $row[$db_columnAmount];
    if(
    $amount)
    {
    mysql_query("UPDATE `$db_table` SET $db_columnMoney = $db_columnMoney + $amount WHERE $db_columnUser='$login'");
    mysql_query("DELETE FROM `$db_tableMoneyKeys` WHERE `$db_columnKey` = '$key'");
    $row mysql_fetch_assoc(mysql_query("SELECT $db_columnUser,$db_columnMoney FROM $db_table WHERE $db_columnUser='$login'"));
    $money $row[$db_columnMoney];
    echo 
    "success:".$money;
    } else echo 
    "badkey";
    } else
     
    if(
    $action == 'uploadskin')
    {
    if(!
    is_uploaded_file($_FILES['ufile']['tmp_name'])) die("Файл не выбран");
    $imageinfo getimagesize($_FILES['ufile']['tmp_name']);
    if(
    $imageinfo['mime'] != 'image/png' || $imageinfo["0"] != '64' || $imageinfo["1"] != '32') die("Этот файл не является файлом скина");
     
    $uploaddir 'skins/';
    $uploadfile $uploaddir.$login.".png";
     
    if(
    move_uploaded_file($_FILES['ufile']['tmp_name'], $uploadfile)) echo "success";
    else echo 
    "Ошибка загрузки файла";
    } else
     
    if(
    $action == 'exchange')
    {
    $wantbuy $_GET['buy'];
    $gamemoneyadd = ($wantbuy $priceByIconMoney);
    $row mysql_fetch_assoc(mysql_query("SELECT $db_columnUser,$db_columnMoney FROM $db_table WHERE $db_columnUser='$login'"));
    $query $row[$db_columnMoney];
     
    if(
    $wantbuy == '' || $wantbuy 1) die("Вы не ввели сумму!");
    if(!
    $iconregistered) die("Вас нет в базе IConomy");
    if(
    $query >= $wantbuy)
    {
    mysql_query("UPDATE iconomy SET balance = balance + $gamemoneyadd WHERE username='$login'");
    mysql_query("UPDATE $db_table SET $db_columnMoney = $db_columnMoney - $wantbuy WHERE $db_columnUser='$login'");
     
    $row mysql_fetch_assoc(mysql_query("SELECT $db_columnUser,$db_columnMoney FROM $db_table WHERE $db_columnUser='$login'"));
    $money $row[$db_columnMoney];
     
    $row mysql_fetch_assoc(mysql_query("SELECT username,balance FROM iconomy WHERE username='$login'"));
    $iconmoney $row['balance'];
     
    echo 
    "success:".$money.":".$iconmoney;
    } else die(
    "У вас недостаточно средств!");
    }
     
    function 
    generateSessionId()
    {
    srand(time());
    $randNum rand(10000000002147483647).rand(10000000002147483647).rand(0,9);
    return 
    $randNum;
    }
     
    function 
    hash_xauth()
    {
    global 
    $realPass$postPass;
    $cryptPass false;
    $saltPos = (strlen($postPass) >= strlen($realPass) ? strlen($realPass) : strlen($postPass));
    $salt substr($realPass$saltPos12);
    $hash hash('whirlpool'$salt $postPass);
    $cryptPass substr($hash0$saltPos) . $salt substr($hash$saltPos);
    return 
    $cryptPass;
    }
     
    function 
    hash_md5()
    {
    global 
    $postPass;
    $cryptPass false;
    $cryptPass md5($postPass);
    return 
    $cryptPass;
    }
     
    function 
    hash_launcher()
    {
    global 
    $postPass;
    $cryptPass false;
    $cryptPass md5($postPass);
    return 
    $cryptPass;
    }
     
    function 
    hash_dle()
    {
    global 
    $postPass;
    $cryptPass false;
    $cryptPass md5(md5($postPass));
    return 
    $cryptPass;
    }
     
    function 
    hash_cauth()
    {
    global 
    $realPass$postPass;
    $cryptPass false;
    if (
    strlen($realPass) < 32)
    {
    $cryptPass md5($postPass);
    $rp str_replace('0'''$realPass);
    $cp str_replace('0'''$cryptPass);
    (
    strcasecmp($rp,$cp) == $cryptPass $realPass $cryptPass false);
    }
    else 
    $cryptPass md5($postPass);
    return 
    $cryptPass;
    }
     
    function 
    hash_authme()
    {
    global 
    $realPass$postPass;
    $cryptPass false;
    $ar preg_split("/\\$/",$realPass);
    $salt $ar[2];
    $cryptPass '$SHA$'.$salt.'$'.hash('sha256',hash('sha256',$postPass).$salt);
    return 
    $cryptPass;
    }
     
    function 
    hash_joomla()
    {
    global 
    $realPass$postPass;
    $cryptPass false;
    $parts explode':'$realPass);
    $salt $parts[1];
    $cryptPass md5($postPass $salt) . ":" $salt;
    return 
    $cryptPass;
    }
     
    function 
    hash_ipb()
    {
    global 
    $postPass$salt;
    $cryptPass false;
    $cryptPass md5(md5($salt).md5($postPass));
    return 
    $cryptPass;
    }
     
    function 
    hash_xenforo()
    {
    global 
    $postPass$salt;
     
    $cryptPass false;
    $cryptPass hash('sha256'hash('sha256'$postPass) . $salt);
     
    return 
    $cryptPass;
    }
     
    function 
    hash_wordpress()
    {
    global 
    $realPass$postPass;
    $cryptPass false;
    $itoa64 './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $count_log2 strpos($itoa64$realPass[3]);
    $count << $count_log2;
    $salt substr($realPass48);
    $input md5($salt $postPassTRUE);
    do 
    $input md5($input $postPassTRUE);
    while (--
    $count);
    $output substr($realPass012);
    $count 16;
    $i 0;
    do
    {
    $value ord($input[$i++]);
    $cryptPass .= $itoa64[$value 0x3f];
    if (
    $i $count$value |= ord($input[$i]) << 8;
    $cryptPass .= $itoa64[($value >> 6) & 0x3f];
    if (
    $i++ >= $count) break;
    if (
    $i $count$value |= ord($input[$i]) << 16;
    $cryptPass .= $itoa64[($value >> 12) & 0x3f];
    if (
    $i++ >= $count) break;
    $cryptPass .= $itoa64[($value >> 18) & 0x3f];
    } while (
    $i $count);
     
    $cryptPass $output $cryptPass;
    return 
    $cryptPass;
    }
     
    function 
    hash_vbulletin()
    {
    global 
    $postPass$salt;
    $cryptPass false;
    $cryptPass md5(md5($postPass) . $salt);
    return 
    $cryptPass;
    }
     
    function 
    hash_drupal()
    {
    global 
    $postPass$realPass;
    $cryptPass false;
    $setting substr($realPass012);
    $itoa64 './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $count_log2 strpos($itoa64$setting[3]);
    $salt substr($setting48);
    $count << $count_log2;
    $input hash('sha512'$salt $postPassTRUE);
    do 
    $input hash('sha512'$input $postPassTRUE);
    while (--
    $count);
     
    $count strlen($input);
    $i 0;
     
    do
    {
    $value ord($input[$i++]);
    $cryptPass .= $itoa64[$value 0x3f];
    if (
    $i $count$value |= ord($input[$i]) << 8;
    $cryptPass .= $itoa64[($value >> 6) & 0x3f];
    if (
    $i++ >= $count) break;
    if (
    $i $count$value |= ord($input[$i]) << 16;
    $cryptPass .= $itoa64[($value >> 12) & 0x3f];
    if (
    $i++ >= $count) break;
    $cryptPass .= $itoa64[($value >> 18) & 0x3f];
    } while (
    $i $count);
    $cryptPass $setting $cryptPass;
    $cryptPass substr($cryptPass055);
    return 
    $cryptPass;
    }
     
    function 
    auth()
    {
    global 
    $login,$postPass,$serial;
    include(
    "connect.php");
    if (
    $crypt == 'hash_md5' || $crypt == 'hash_authme' || $crypt == 'hash_xauth' || $crypt == 'hash_cauth' || $crypt == 'hash_joomla' || $crypt == 'hash_wordpress' || $crypt == 'hash_dle' || $crypt == 'hash_launcher')
    {
    $query mysql_query("SELECT $db_columnUser,$db_columnPass,$db_columnSerial FROM $db_table WHERE $db_columnUser='$login'") or die(mysql_error());
    $row mysql_fetch_assoc($query);
    $realPass $row[$db_columnPass];
    } else if (
    $crypt == 'hash_ipb' || $crypt == 'hash_vbulletin')
    {
    $row mysql_fetch_assoc(mysql_query("SELECT $db_columnUser,$db_columnPass,$db_columnSalt,$db_columnSerial FROM $db_table WHERE $db_columnUser='$login'"));
    $realPass $row[$db_columnPass];
    $salt $row[$db_columnSalt];
    } else if(
    $crypt == 'hash_xenforo')
    {
    $row mysql_fetch_assoc(mysql_query("SELECT $db_table.$db_columnId,$db_table.$db_columnUser,$db_table.$db_columnSerial,$db_tableOther.$db_columnId,$db_tableOther.$db_columnPass FROM $db_table$db_tableOther WHERE $db_table.$db_columnId = $db_tableOther.$db_columnId AND $db_table.$db_columnUser='$login'"));
    $realPass substr($row[$db_columnPass],22,64);
    $salt substr($row[$db_columnPass],105,64);;
    }
    $realserial $row[$db_columnSerial];
    if(!
    $realPass) return false;
    $checkPass $crypt();
    if(!
    strcmp($realPass,$checkPass) == 0) return false;
    if((!empty(
    $serial) && strcmp($serial,$realserial) == 0) || $useMacOnEnter == false) return true;
    return 
    false;
    }
    ?>
     
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Эм.. Хотя бы тегом code бы обрамили. Ну да ладно.
    У ксена есть класс, который отвечает за аутентификацию. Он без проблем позволяет работать с различными методами шифрования. Те же пароли из булки без проблем работают без необходимости генерации новых.
    Ладно. А Вы проверяли, что оказывается в поле $row[$db_columnPass]? Возможно, там что-то не в том виде, не с тем смещением и т.д.
    По идее функция вроде правильная. Только еще один нюанс. У Вас в скрипте жестко задана функция sha256, тогда как она может быть и sha1. Также в ксеновской базе могут одновременно использоваться различные методы шифрования. Т.е. в одной таблице один пользователь может аутентифицироваться по дефолтному методу ксена, а другой пользователь (после импорта обычно) - по булковскому методу.
    В общем Вам нужно просто отладить скрипт и посмотреть, что откуда берется. Так-то скрипт на первый взгляд корректный, но не учитывает некоторые нюансы.
     
  7. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Только вот от SQL injection нифига не защищенный.
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Ну там вообще жесткий кодинг. Видимо, тот, кто писАл, не напрягался хоть какой-то оптимизацией и секурностью.
     
    Pepelac нравится это.

Поделиться этой страницей