Гость stibs

Защита аккаунта игрока - Google Authenticator

В теме 6 сообщений

Переходим к заключению циклу уроков,

посвященных защите аккаунта игрока. Это третий финальный урок. И мы начинаем. 

Сегодня будем защищать аккаунт игрока с помощью еще одного нехитрого способа - Google Authenticator. Данная штука генерирует временный пароль, в кодировке BASE32. Соответственно даже если злоумышленник будет знать основной пароль от вашего аккаунта, временный он уже НИКАК не получит. 

Приступаем к самой сути. 

Скачиваем эту папку (плагин с инклудом):

TOTP-plugin-1.0.0.zip

В ней есть версия плагина под windows и linux, также содержится инклуд. 

А теперь переходим к коду:
Ко всем #include / в начало мода:

#include <TOTP>

Ну и теперь для примера создадим команду, которая будет генерировать код в base32 (все заглавные английские буквы от A до Z и цифры от 2 до 7), после чего пользователь введет данный код в приложение Google Authenticator и ему выдаст второй код, который он должен будет ввести уже в диалог собственно. 

В начало мода:
 

new code[17];

Ко всем командам (zcmd / dc_cmd) (если уберете шапку команды, то можно куда угодно :))

CMD:secretcode(playerid)
{
    new base_encoding[32][] =
    {
        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y","Z","2", "3", "4", "5", "6", "7"
    }
    ;
    for(new i; i < 17; i++) strcat(code, base_encoding[random(sizeof(base_encoding))]); // генерируем наш код в кодировке BASE32
    SendClientMessage(playerid, -1, "Введите код, который сейчас появится на экране в приложение Google Authenticator, а затем введите в поле для ввода код, которое вам выдало приложение");
    static const fmt_str[] = "{BEBEBE}Код, который необходимо ввести в приложение GoogleAuthenticator: {FFFFFF}%s\n{BEBEBE}Введите код, который выдало приложение:";
    new str[sizeof(fmt_str)+ (-2+sizeof(base_encoding))];
    format(str, sizeof(str), fmt_str, code); // форматируем строку
    ShowPlayerDialog(playerid, 1302, DIALOG_STYLE_INPUT, "Подтверждение Гугл Аутентификатор", str, "Ввести", "Отмена");
    return true;
}

Далее напишем действие для нашего диалога:
 

if(dialogid == 1302)
{
    if(!strlen(inputtext)) return Kick(playerid); // ничего не ввел
    new codegoogle = GoogleAuthenticatorCode(code, gettime()); //получаем код от гугл (из цифр)
    if(strval(inputtext) != codegoogle) return Ban(playerid); // ввел неверно код, баним IPшник
    SendClientMessage(playerid, -1, "Код введен верно, вход на сервер разрешен!"); // если все норм
    SpawnPlayer(playerid); // спавним игрока или что вам там надо делаем тут
}

Ну и в принципе все. 

Автор данного кода и текста: @stibs

Автор идеи: Games. 

Автор плагина: Games. 

При копировании на другие ресурсы обязательно указывайте авторство и ссылку на источник. Если локальные правила форума не позволяют выкладывать ссылки на посторонние ресурсы, тогда материал к публикации запрещается.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Куда кидать это?:

if(dialogid == 1302)
{
    if(!strlen(inputtext)) return Kick(playerid); // ничего не ввел
    new codegoogle = GoogleAuthenticatorCode(code, gettime()); //получаем код от гугл (из цифр)
    if(strval(inputtext) != codegoogle) return Ban(playerid); // ввел неверно код, баним IPшник
    SendClientMessage(playerid, -1, "Код введен верно, вход на сервер разрешен!"); // если все норм
    SpawnPlayer(playerid); // спавним игрока или что вам там надо делаем тут
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Дима Нисанский, в OnDialogResponse.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поправьте: 

DIALOG_STLYE_INPUT
ShowPlayerDialog(playerid, 1302, DIALOG_STYLE_INPUT, "Подтверждение Гугл Аутентификатор", str, "Ввести", "Отмена");

 

Ошибку выдаёт:

error 001: expected token: ",", but found ";"

Строка:

for(new i; i < 17; i++) strcat(googlecode, base_encoding[random(sizeof(base_encoding))]; 

 

Заметка от DEST , создано

Поправил, спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Zishka,

for(new i; i < 17; i++) strcat(googlecode, base_encoding[random(sizeof(base_encoding))]); 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как активировать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • gooding
      От gooding


      Скачать файл PAR RP | Доработанный мод Cruela RP | Без багов
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
      Основа данного мода: Cruela RP
       
       

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)  
    • gooding
      От gooding
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
      Основа данного мода: Cruela RP
       
       

    • Max Luilchack
      От Max Luilchack
      Нужен человек который сможет сделать примерную карту Украины для сервера crmp mobile. Если есть желающие пишите в дс: lamarlml
    • Yashich
      От Yashich
      Возникла проблема, не работает команда /giverank Что здесь может работать не так? Заранее спасибо за ответ)
      Вот строки кода связанные с этой командой (мод Аризона)
       
      CMD:giverank(playerid, params[]) {     if(PI[playerid][pMember]<=0)return 0;     if(PI[playerid][pRank] < 9 && PI[playerid][pLeader] == 0) return SCM(playerid, COLOR_RED, !"Отказано в доступе!");     if(sscanf(params,"ud",params[0],params[1])) return SCM(playerid, COLOR_RED, !"Используйте: /giverank [id] [rank]");     if(!ProxDetectorS(8.0, playerid, params[0])) return SCM(playerid, COLOR_GREY, !"Вы должны находиться рядом с игроком!");     if(PI[params[0]][pLeader] > 0 ) return SCM(playerid, COLOR_RED, !"Вы не можете изменять ранг лидеру");     if(params[1] < 1) return SCM(playerid, COLOR_GREY, !"Нельзя повысить до этого ранга");     if(Clother[params[0]]!=-1)return 0;     if(GetPlayerVirtualWorld(playerid)!=GetPlayerVirtualWorld(params[0]))return 0;     if(!IsPlayerConnected(params[0])) return SCM(playerid, COLOR_GREY, !"Игрок не найден");     if(PI[playerid][pRank] <= PI[params[0]][pRank]) return SCM(playerid, COLOR_GREY, !"Вы не можете повысить/понизить этого игрока");     if(PI[playerid][pRank] == 9 && params[1] > 8) return SCM(playerid, COLOR_RED, !"Нельзя выдать ранг больше 8");     if(params[1] > 9) return SCM(playerid, COLOR_GREY, !"Нельзя повысить до этого ранга");     if(PI[params[0]][pMember] != PI[playerid][pMember]) return SCM(playerid, COLOR_GREY, !"Игрок находиться в другой организации!");     str_1[0] = EOS;     f(str_1,100,"Лидер %s %s до %i ранга",PN(playerid),PI[params[0]][pRank] > params[1] ? ("понизил"):("повысил"),params[1]);     SCM(params[0],COLOR_LIGHTBLUE,str_1);     f(str_1,100,"Вы %sи игрока %s до %i ранга",PI[params[0]][pRank] > params[1] ? ("понизил"):("повысил"),PN(params[0]),params[1]);     SCM(playerid,COLOR_LIGHTBLUE,str_1);     PI[params[0]][pRank] = params[1];     UpdatePlayerDataInt(params[0], "Rank", params[1]);     if(PI[params[0]][pSex] == 2) if(TeamDuty{params[0]}) SetPlayerSkinEx(params[0],GOrgSkins[GetTeamID(params[0])][params[1]]), TogglePlayerControllable(params[0],true);     else if(TeamDuty{params[0]}) SetPlayerSkinEx(params[0],MOrgSkins[GetTeamID(params[0])][params[1]]), TogglePlayerControllable(params[0],true);     return 1; }