[Урок] Админ-Система /alogin как на самп рп или в подобии - Форум Cheat-Master.ru
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Модератор форума: Phoenixxx_Czar, Getbackthere, [CM]OlegEhtler  
[Урок] Админ-Система /alogin как на самп рп или в подобии
Голубь Дата: Среда, 21.01.2015, 18:54 | Сообщение # 1
Авторитет
Сообщений: 2137
Статус: Offline
Меня давно просили выложить эту систему, вот пришло время её выложить в паблик.
Дата написания системы: лето 2013
Дата написания урока: зима 2015 (1 квартал года)
Автор: Голубь

Плюсы:
  • Система основных и гостевых серверов.
  • Удобно для владельцев нескольких серверов.
  • Защита от в3лома админов (если злоумышленник узнает пароль на гостевом сервере и его алогин, то он не сможет войти.
  • Пароль от админки одинаковый на всех серверах.
  • Ставить/Снимать/Повышать админов находясь далеко от компьютера, с мобильного устройства, управление через сайт (исходники ПУ пока не предоставляю, в .php файлах быдлокод).
  • Организация уровней админки на гостевых серверах.
  • Можно синхронизировать с вашим ЛК, мониторингом, и т.д.


    Минусы:
  • На владельцев только одного сервера, хватило бы простого значения в переменной админки.
  • Для кого как...

    Теория
    После ввода пароля в /alogin, отправляется HTTP запрос на наш гейт, гейт решает выдавать ли пользователю админку, вернет ошибки или уровень админки, даже дело за модом.
    Если у игрока пароль "255", записываем в его таблицу пароль, который он ввел.
    Если у игрока нет админки - вернем "NO", При неверном пароле, возвращаем ошибку "PI", если игрок пытался авторизоваться на гостевом сервере, не сбив IP адрес на основном, выдаем ошибку "IC", пройдя эти проверки, вернем нужный лвл админки, в зависимости от сервера.
    У меня такая система:
    1 lvl основа, 1 гостевой.
    2 lvl основа, 1 гостевой.
    3 lvl основа, 2 гостевой.
    4 lvl основа, 2 гостевой.
    5 lvl основа, 2 гостевой.
    6 lvl основа, 4 гостевой.
    7 и выше - не меняется.

    Далее мод вернет ошибку, или установит лвл админки.

    Теперь практика.
    Практика
    Нам понадобится:
    1. Любой хостинг с MySQL, PHP
    2. Сам сервер с готовым модом

    Работы на хостинге:

    Нам надо придумать секретный ключ, пусть это будет "effre4f45f43d"

    Создам таблицу и БД на хостинге, вот дамп таблицы:
    Код
    -- phpMyAdmin SQL Dump
    -- version 3.5.8.2
    -- http://www.phpmyadmin.net
    --
    -- Хост: localhost
    -- Время создания: Янв 21 2015 г., 14:30
    -- Версия сервера: 5.5.37-cll-lve
    -- Версия PHP: 5.4.28

    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;

    --
    -- База данных: `admin`
    --

    -- --------------------------------------------------------

    --
    -- Структура таблицы `admin`
    --

    CREATE TABLE IF NOT EXISTS `admin` (
             `nick` varchar(32) COLLATE cp1251_bin NOT NULL,
             `password` varchar(17) COLLATE cp1251_bin NOT NULL,
             `level` int(11) NOT NULL,
             `server` int(11) NOT NULL,
             `lastlogin` varchar(30) COLLATE cp1251_bin NOT NULL,
             `lastserver` varchar(30) COLLATE cp1251_bin NOT NULL,
             `lastIP` varchar(17) CHARACTER SET cp1250 COLLATE cp1250_bin NOT NULL,
             `id` int(11) NOT NULL,
             `UnixLastLogin` int(11) NOT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin;

    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


    Создадим гейт atest.php:
    Код
    <?php

    function SuccessLogin($level, $ip, $server, $nick)
    {
            mysql_query("UPDATE  `admintest` SET `lastserver` =  '$server', `lastIP` =  '$ip', `UnixLastLogin` =  UNIX_TIMESTAMP() WHERE  `nick` = '$nick'");
            echo"$level";
            mysql_close();
            exit;
    }

    function SetPassword($nick, $password)
    {
            mysql_query("UPDATE  `admintest` SET `password` =  '$password' WHERE  `nick` = '$nick'");
    }

    if($_GET['skey'] == "ВАШ_СЕКРЕТНЫЙ КЛЮЧ")
    {
            $nick = $_GET['nick'];
            $password = $_GET['password'];
            $server = $_GET['server'];
            $playerip = $_GET['ip'];
            $l=mysql_connect("localhost", "ЮЗЕР", "ПАРОЛЬ");
            mysql_select_db("admin");
            $sql = "SELECT * FROM  `admintest` WHERE `nick` = '$nick'";
            $result = mysql_query($sql);
            if(mysql_num_rows($result) == 0) die("NO|0"); //не админ
            $row = mysql_fetch_assoc($result);
            if($row['password'] == "255")
            {
             SetPassword($nick, $password);
             $row['password'] = $password;
            }
            if($password != $row['password']) die("PI|0"); //неверный пароль
            if($server == $row['server']) SuccessLogin($row['level'], $playerip, $server, $nick); //игрок зашел под админку на основном сервере, пускаем.
            else //гостевой сервер
            {
             if($playerip != $row['lastIP']) die("IC|0"); //ип сменился, зовем игрока на основной сервер
             switch($row['level'])
             {
              case 1: SuccessLogin(1, $playerip, $server, $nick);
              case 2: SuccessLogin(1, $playerip, $server, $nick);
              case 3: SuccessLogin(2, $playerip, $server, $nick);
              case 4: SuccessLogin(2, $playerip, $server, $nick);
              case 5: SuccessLogin(2, $playerip, $server, $nick);
              case 6: SuccessLogin(4, $playerip, $server, $nick);
              default: SuccessLogin($row['level'], $playerip, $server, $nick);
             }
            }
    }
    else die("IK");

    ?>

    И напишите простой ПУ для управления у админами.

    Перейдем в Pawn код:
    Для начала, создадим в массиве PlayerInfo переменную "pBeAdmin", заменяем получение и запись в нее из обычного MySQL поля "pAdmin".

    Объявим переменные:
    Код
    new PlayerAlogin[MAX_PLAYERS]; // эту обновлять при OnPlayerConnect
    new serveridthis = 2; //а тут храним номер сервера


    Сделаем команду /alogin:
    Код
    CMD:alogin(playerid, params[])
    {
             if(!AcceptWrite(playerid)) return 1; //залогинился ли игрока
             if(PlayerAlogin[playerid]) return ShowPlayerDialog(playerid,DIALOGINFO,0,"Админ авторизация","{6347AA}Вы уже отправили запрос","Закрыть","");//если запрос еще не обработан
             ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
             return 1;
    }


    В OnDialogResponse:
    Код
    case 153:
                   {
                   if(response){
             if(!strlen(inputtext)) return  ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
             if(strlen(inputtext) < 6 || strlen(inputtext) > 15) return  ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
             if(IsPassInvalid(inputtext)) return  ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
             new count1;
              for (new i; i < strlen(inputtext); i++)
               if (inputtext[i] >= '0' && inputtext[i] <= '9')
                count1++;
             if(count1 == 0) return  ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
             if(strlen(inputtext) == count1) return  ShowPlayerDialog(playerid,153,DIALOG_STYLE_PASSWORD,"Админ авторизация","Введите пароль\n\nПароль должен состоять из латинских букв и цифр\n\tразмером от 6 до 15 символов","Вход","Отмена");
    if(!strcmp(pData[playerid][pPassword], inputtext, true)) return  ShowPlayerDialog(playerid,DIALOGINFO,DIALOG_STYLE_MSGBOX,"Админ авторизация","Пароль не должен совпадать с игровым","Закрыть","");
             PlayerAlogin[playerid] = 1;
             format(httpquery,sizeof(httpquery),"ВАШ_САЙТ.ru/getadm.php?skey=ВАШ_СЕКРЕТНЫЙ КЛЮЧ&nick=%s&password=%s&server=%d&ip=%s",getName(playerid), inputtext, serveridthis, GetIP(playerid));
             HTTP(playerid, HTTP_GET, httpquery, "", "ForAdminLogin");
             }
                   }


    Создадим паблик:
    Код
    forward ForAdminLogin(index, response_code, data[]);
    public ForAdminLogin(index, response_code, data[])
    {
               if(response_code == 200)
               {
             if(!PlayerAlogin[playerid]) return SendClientMessage(index, COLOR_GREY, "Ошибка входа"); //возможно игрок пытался в3ломать систему
                   PlayerAlogin[index] = 0;
                   if(!strcmp(data,"IK",true,2)) return SendClientMessage(index, COLOR_GREY, "Неизвестная ошибка");
                   if(!strcmp(data,"NO",true,2)) return SendClientMessage(index, COLOR_GREY, "Вы не модератор");
                   if(!strcmp(data,"PI",true,2)) return SendClientMessage(index, COLOR_GREY, "Вы ввели неверный пароль"),ASendMes(1,0xF4B800AA,"<ALogin> %s[%d] ввел неверный пароль",getName(index),index);
                   if(!strcmp(data,"IC",true,2)) return SendClientMessage(index, 0x9F0000FF, "Ваш IP сменился, авторизируйтесь на своем основном сервере");
             new admlvl = strval(data);
                   pData[index][pBeAdmin] = admlvl; //для автобана, не используйте эту переменную для проверки наличия админки
             pData[index][pAdmin] = admlvl; //сам лвл админки
             PlayerAlogin[index] = 0;
             SendMes(index,0xF4B800AA,"Вы авторизировались как модератор %d уровня",admlvl);
             if(admlvl < 7) ASendMes(1,0xF4B800AA,"<ALogin> вошел %s[%d]",getName(index),index);
               }
               else
               {
                  return PlayerAlogin[index] = 0,ShowPlayerDialog(index,DIALOGINFO,0,"Ошибка","Ошибка соединения! Повторите позже","Закрыть","");
               }
               return 1;
    }


    Всё готово. Код может затребовать функции, которых нету в некоторых модах, их можно написать самим, или заменить на свои.

    Так же прилагаю к материалу тест сервера, мою ПУ и ЛК для серверов:
    http://beta.povargek.ru/ - пароль "somp-rp.ru" - без кавычек
    http://somp-rp.ru/аккаунт/ - ЛК для всех пяти серверов
    IP адреса:
    144.76.133.117:7770 - 1 сервер
    144.76.133.117:7771 - 2 сервер
    144.76.133.117:7772 - 3 сервер
    144.76.133.117:7773 - 4 сервер
    144.76.133.117:7774 - 5 сервер

    Данная система уже использовалась на сервере Eax-Rp, и используется на Samp-Rp.Ru, по которому была написана эта система.

    При копировании указывайте источник и автора!

    двач
    https://vk.com/povargek


    Сообщение отредактировал Голубь - Понедельник, 09.03.2015, 11:44
  • Eminemkaa Дата: Среда, 21.01.2015, 19:59 | Сообщение # 2
    Новичок
    Сообщений: 3
    Статус: Offline
    Бро збс)
    [CM]App1e Дата: Среда, 21.01.2015, 20:07 | Сообщение # 3
    КУПЛЮ АДМИНКУ СРП
    Сообщений: 1784
    Статус: Offline
    отлично)

    Продам админку SAMP-RP: http://cheat-master.ru/forum/96-565203-1
    Devic Дата: Среда, 21.01.2015, 21:53 | Сообщение # 4
    ハンサム
    Сообщений: 1404
    Статус: Offline
    Саня, как всегда - на высоте!
    [CM]Tazik Дата: Четверг, 22.01.2015, 00:32 | Сообщение # 5
    б - брынза
    Сообщений: 901
    Статус: Offline
    Как всегда на высоте.
    Скоро у всех модов будет стоять эта система, или же умудриться кто-то и начнет её продать.



    vk.com/andrew_eremy
    mamkin228 Дата: Вторник, 27.01.2015, 19:31 | Сообщение # 6
    Боец
    Сообщений: 68
    Статус: Offline
    Шикаррно
    [CM]Neuron Дата: Вторник, 27.01.2015, 22:32 | Сообщение # 7
    Новичок
    Сообщений: 26
    Статус: Offline
    Как всегда на высоте,норм

    AnanaS123 Дата: Вторник, 27.01.2015, 23:14 | Сообщение # 8
    Бывалый
    Сообщений: 351
    Статус: Offline
    Отлично, спасибо

    Качественная студия графики - https://vk.com/raydstudio
    Трудоустроюсь дизайнером в проект.
    Приму в дар аккаунты на серверах SA:MP. Буду благодарен.
    Голубь Дата: Пятница, 30.01.2015, 21:10 | Сообщение # 9
    Авторитет
    Сообщений: 2137
    Статус: Offline
    Самое главное забыл
    Код
    if(!strcmp(pData[playerid][pPassword], inputtext, true)) return  ShowPlayerDialog(playerid,DIALOGINFO,DIALOG_STYLE_MSGBOX,"Админ авторизация","Пароль не должен совпадать с игровым","Закрыть","");


    двач
    https://vk.com/povargek
    Metresha46 Дата: Суббота, 07.02.2015, 20:01 | Сообщение # 10
    Новичок
    Сообщений: 3
    Статус: Offline
    Блин помогите пожалуйста чё за фигня ?
    Rengar Дата: Суббота, 07.02.2015, 20:12 | Сообщение # 11
    Новичок
    Статус: Offline
    Metresha46, у всех так

    Нуб
    Logitеch Дата: Суббота, 07.02.2015, 21:57 | Сообщение # 12
    Боец
    Сообщений: 54
    Статус: Offline
    Цитата Metresha46 ()
    Блин помогите пожалуйста чё за фигня ?


    Проблема в том,что нету кодировки а именно: UTF-8,загугли там есть решение


    Бывший Главный Администратор SAMP-RP.RU
    Metresha46 Дата: Суббота, 07.02.2015, 21:59 | Сообщение # 13
    Новичок
    Сообщений: 3
    Статус: Offline
    И как мне войти в этот кабинет ? Что писать в первую и во вторую строку ?
    Logitеch Дата: Суббота, 07.02.2015, 23:00 | Сообщение # 14
    Боец
    Сообщений: 54
    Статус: Offline
    Цитата Metresha46 ()
    И как мне войти в этот кабинет ? Что писать в первую и во вторую строку ?


    Первая строка это секретный код на картинке,второй это пароль


    Бывший Главный Администратор SAMP-RP.RU
    [CM]Dave™ Дата: Вторник, 24.02.2015, 00:04 | Сообщение # 15
    Боец
    Сообщений: 138
    Статус: Offline
    • Страница 1 из 3
    • 1
    • 2
    • 3
    • »
    Поиск:
    Статистика Форума