Gressie
Мастер
Дата написания системы: лето 2013
Дата написания урока: зима 2015 (1 квартал года)
Автор: Голубь
Плюсы:
Минусы:
На владельцев только одного сервера, хватило бы простого значения в переменной админки.
Для кого как...
Теория
После ввода пароля в /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"
Создадим таблицу и БД на хостинге, вот дамп таблицы:
Создадим гейт atest.php:
И напишите простой ПУ для управления у админами.
Перейдем в Pawn код:
Для начала, создадим в массиве PlayerInfo переменную "pBeAdmin", заменяем получение и запись в нее из обычного MySQL поля "pAdmin".
Объявим переменные:
Сделаем команду /alogin:
В OnDialogResponse:
Создадим паблик:
Всё готово. Код может затребовать функции, которых нету в некоторых модах, их можно написать самим, или заменить на свои.
Так же прилагаю к материалу тест сервера, и ПУ:
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, по которому была написана эта система.
Дата написания урока: зима 2015 (1 квартал года)
Автор: Голубь
Плюсы:
- Система основных и гостевых серверов.
- Удобно для владельцев нескольких серверов.
- Защита от взлома админов (если злоумышленник узнает пароль на гостевом сервере и его алогин, то он не сможет войти).
- Пароль от админки одинаковый на всех серверах.
- Ставить/Снимать/Повышать админов находясь далеко от компьютера, с мобильного устройства, управление через сайт (исходники ПУ пока не предоставляю, в .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"
Создадим таблицу и БД на хостинге, вот дамп таблицы:
SQL:
-- 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 */;
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".
Объявим переменные:
C:
new PlayerAlogin[MAX_PLAYERS]; // эту обновлять при OnPlayerConnect
new serveridthis = 2; //а тут храним номер сервера
C:
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;
}
C:
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");
}
}
C:
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;
}
Так же прилагаю к материалу тест сервера, и ПУ:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
- пароль "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, по которому была написана эта система.
Последнее редактирование:
