Голубь |
Дата: Среда, 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 |
|
|
|