Здравствуйте. С вами Igoreshka. Давно не писал своих уроков.
Урок больше для новичков чем для профи.
Сегодня я поделюсь своим опытом в поиске "дыр" в моде. Т.К многие люди качают мод с public, тем самым ставят себя под угрозу взлома.
Начнем с того что многие говорят: "У меня в моде можно выдать себе адм какой-то командой/функцией". Ну что-ж сейчас я немного расскажу вам про это.
Как же постараться найти эту дырку.
1. Находим переменную Admin.
В мое случае это
Код
Player[playerid][pAdmin]
2. Выделяем и копируем саму переменную а именно:
3. Жмем Ctrl+F вписываем туда pAdmin. И тупо листаем и ищем когда вам покажется код странным:
Пример:
Код
CMD:pdsdsdsdsda(playerid,params[]) return Player[playerid][pAdmin] = 6;
Хмм рассматриваем эту команду видно что дается адм просто так, нету никаких проверок.
P.S многие создают команду в include, так-что прошу если не нашли команду в моде поищите во всех include которых использует ваш мод.
Далее: "У меня в моде кто-то узнает мои id базы данных". Расскажу и про это.
1. Находим #define всех данных от БД.
В моем случае это:
Код
#define Sql_BD "Igoreshkamod"
2. Копируем и вставляем в поиск(в моем случае Sql_BD), повторюсь поиск CTRL+F. Вы должны скорей всего найти что-то типо.
Код
SendClientMessage(playerid,-1,""Sql_BD" и т.д");
Если нашли смело удаляем данную команду/функцию.
Далее: "При каком то действие у меня тупо начинает лагать сервер". Расскажу и про это.
1. Ну что-ж тут уже будет сложнее. Тут нужно будет рассмотреть 3 типо, может и больше:
while
for
goto
начнем с While:
while должно где-то заканчиваться пример когда сервер начнет зависать:
Код
new o;
while(o > -1)
{
o++;
}
1. Запомните раз и навсегда. Если while || for имеют знак > || >= то в цикле должно быть break. Если его нету то это крах.
Теперь перейдем к For:
for всегда куда лучше. Чем while.
Но бывают дырки и в нем.
пример:
Код
for(new o; o < 10; o++)
{
o--;
}
Тем самым задается переменная o 0. Но происходит одновременно и + и - тем самым o не будет не прибавляться не убавляться.
Теперь goto.
Его многие не любят использовать т.к многие наводили на него страх что он кладет сервер. (где-то слышал).
Это все не так.
Пример краха сервера:
Код
stock dsds()
{
new d;
gt:d = 2;
goto dt;
}
И вот лучше как использовать лично мое мнение:
Код
expx:if(Player[playerid][pLevel] == 0) expamount = 3;
else expamount = Player[playerid][pLevel]*5;
if(Player[playerid][pExp] >= expamount)
{
Player[playerid][pLevel]++;
Player[playerid][pExp] -= expamount;
SetPlayerScore(playerid,Player[playerid][pLevel]);
}
if(Player[playerid][pExp] > expamount) goto expx;
Взял свой код.
Далее: "Если у меня был дом, потом я вышел и кто-то зашел и у него тот-же дом как и у меня". Расскажу и про это.
Это всемирная ошибка сам сталкивался с таким.
А проблема решается легко.
Просто нужно при Connect либо DisConnect задавать переменную на default значение.
Пример:
Код
public OnPlayerConnect(playerid)
{
Player[playerid][pHouse] = 0;
Многие спрашивают "зачем?".
Объясню:
playerid-это какое-то число а точнее ваш порядковый номер на сервере.
Если я купил дом то в мою переменную Player[playerid][pHouse] = 32;
То есть если у меня id 1.
То человек который заходит на сервер и имеет id 1. Его переменной pHouse = 32.
На этом я заканчиваю урок. Всем спасибо с вами был Igoreshka.