PDA

Просмотр полной версии : [Вопрос] По бану IP



Kenny_Dalglish
28.05.2014, 16:05
Сделал бан по IP через MySQL вот как кикает при коннекте - http://rghost.ru/55911158.view
А вот как кикает функций Ban(player); - http://rghost.ru/55911216.view можно как то сделать что бы кикало сразу после Connect to Бла бла. бла.

underwoker
28.05.2014, 17:36
Сделал бан по IP через MySQL вот как кикает при коннекте - http://rghost.ru/55911158.view
А вот как кикает функций Ban(player); - http://rghost.ru/55911216.view можно как то сделать что бы кикало сразу после Connect to Бла бла. бла.
Ты хочешь чтобы было оповещение игроку о том что он забанен?

Kenny_Dalglish
28.05.2014, 17:40
Ты хочешь чтобы было оповещение игроку о том что он забанен?

Не, ну долго идет до кика. В функций Ban там только Conecten to IP и потом сразу кик в моем случий доходит до Conection to Название сервера

DeimoS
29.05.2014, 15:31
Не, ну долго идет до кика. В функций Ban там только Conecten to IP и потом сразу кик в моем случий доходит до Conection to Название сервера

Эмм, можно сделать так, как хотите вы, но работать будет только для IP (не для имени) и придётся переписывать систему бана.

Kenny_Dalglish
29.05.2014, 15:36
Эмм, можно сделать так, как хотите вы, но работать будет только для IP (не для имени) и придётся переписывать систему бана.
То что и надо, в коннекте и так стоит только под IP :)
Всмысле переписовать? Как сделать?

DeimoS
29.05.2014, 15:46
То что и надо, в коннекте и так стоит только под IP :)
Всмысле переписовать? Как сделать?

Используя функцию BlockIpAddress (http://wiki.sa-mp.com/wiki/BlockIpAddress). В таблицу записываем IP и время бана в секундах (согласно параметрам функции). После при старте мода выгружаем данные из БД и загружаем их в память сервера при помощи этой самой функции (BlockIpAddress). Далее сервер сам будет проверять при входе IP игрока среди забаненных и не пускать на сервер ещё до срабатывания колбэка OnPlayerConnect. Ну и бан переделать под запрос + BlockIpAddress + кик с сервера.

Kenny_Dalglish
29.05.2014, 15:48
Опять весь бан переписовать -__-, ещё варианты есть?

DeimoS
29.05.2014, 15:51
Опять весь бан переписовать -__-, ещё варианты есть?

Ну можете попробовать перенести код проверки на бан в колбэк OnIncomingConnection. Но при первой же атаке ботов на сервер, в MySQL полетит миллион запросов

Kenny_Dalglish
29.05.2014, 15:55
Используя функцию BlockIpAddress (http://wiki.sa-mp.com/wiki/BlockIpAddress). В таблицу записываем IP и время бана в секундах (согласно параметрам функции). После при старте мода выгружаем данные из БД и загружаем их в память сервера при помощи этой самой функции (BlockIpAddress). Далее сервер сам будет проверять при входе IP игрока среди забаненных и не пускать на сервер ещё до срабатывания колбэка OnPlayerConnect. Ну и бан переделать под запрос + BlockIpAddress + кик с сервера.
Просто меня не устраивает то что надо записывать ещё время бана IP...

DeimoS
29.05.2014, 15:58
Просто меня не устраивает то что надо записывать ещё время бана IP...

Ну я же сказал ещё один вариант. С помощью этого же колбэка сделайте защиту от флуда коннектами и ничего плохого случиться не должно (хоть при рестарте и будет отсылаться куча запросов, но она и в OnPlayerConnect отсылается)

Kenny_Dalglish
29.05.2014, 16:05
Ну я же сказал ещё один вариант. С помощью этого же колбэка сделайте защиту от флуда коннектами и ничего плохого случиться не должно (хоть при рестарте и будет отсылаться куча запросов, но она и в OnPlayerConnect отсылается)

Как сделать зашиту от флуда коннектами?

DeimoS
29.05.2014, 16:09
Как сделать зашиту от флуда коннектами?

Эмм, посмотрите на параметры колбэка и подумайте.
Или же в паблике есть уже миллион скриптов

Kenny_Dalglish
29.05.2014, 16:29
Эмм, посмотрите на параметры колбэка и подумайте.
Или же в паблике есть уже миллион скриптов

Разве OnIncomingConnection не авто - вызываемый паблик? Почему просит объявить forward?

C:\Users\Danil\Desktop\Äàíè\Äàíè\Inspire DeathMatch [0.3z]\gamemodes\IDM.pwn(8395) : warning 235: public function lacks forward declaration (symbol "OnIncomingConnection")

DeimoS
29.05.2014, 16:46
Он добавлен в SA-MP 0.3z R2-2. Обновите серверную часть

Kenny_Dalglish
29.05.2014, 16:53
Он добавлен в SA-MP 0.3z R2-2. Обновите серверную часть

Обновил все инклуды. Все так же.

DeimoS
29.05.2014, 17:10
Не тем редактором открываете значит. Или не ту версию качаете. Но в стандартных инклюдах r2-2 forward есть.

Kenny_Dalglish
29.05.2014, 17:47
Не тем редактором открываете значит. Или не ту версию качаете. Но в стандартных инклюдах r2-2 forward есть.

Все тем, может быть не то скачал если не трудно дайте ссылочку :)

DeimoS
29.05.2014, 18:43
Все тем, может быть не то скачал если не трудно дайте ссылочку :)

sa-mp.com

Kenny_Dalglish
29.05.2014, 18:50
sa-mp.com
От туда сервер и выкачивал....

DeimoS
29.05.2014, 19:06
От туда сервер и выкачивал....

Уверены, что колбэк верно написали? Параметры все учли?
http://rghost.ru/55993459/image.png

Kenny_Dalglish
29.05.2014, 19:14
sa-mp.com
Страный там инклуд.

/* SA-MP Functions
*
* (c) Copyright 2005-2012, SA-MP Team
*
*/
Залей свой на RGHOST если не сложно :)

Kenny_Dalglish
29.05.2014, 19:51
Попробувал сунул проверку на бан в колэбек OnIncomingConnection даже не вызываеться от туда.

Kenny_Dalglish
29.05.2014, 20:25
Не предоставляю как записать через BlockIpAddress как его в базу записать через INSERT INTO подскажите пожалуйста

DeimoS
29.05.2014, 22:42
Страный там инклуд.

/* SA-MP Functions
*
* (c) Copyright 2005-2012, SA-MP Team
*
*/
Залей свой на RGHOST если не сложно :)

Эмм, мой инклюд именно с того сайта и взят =\


Попробувал сунул проверку на бан в колэбек OnIncomingConnection даже не вызываеться от туда.

Как вставляли? И как обновили серверную часть? На старой версии естественно ничего работать не будет.

Kenny_Dalglish
30.05.2014, 00:41
Эмм, мой инклюд именно с того сайта и взят =\



Как вставляли? И как обновили серверную часть? На старой версии естественно ничего работать не будет.
Обновил инклуд, вот как вставлял:

public OnIncomingConnection(playerid, ip_address[], port)
{
mysql_format(MYSQL_ARG, asd, 90, "SELECT * FROM `BanIP` WHERE `IP` = '%s' LIMIT 1", ip_address);
mysql_function_query(MYSQL_ARG, asd, true, "CheckPlayerBanIP", "i", playerid);
return 1;
}

DeimoS
30.05.2014, 06:45
Ну теперь прологируйте запрос с помощью printf. Сначала сам запрос, а потом паблик, вызываемый запросом. И посмотрите что не работает

- - - Добавлено - - -

Ну теперь прологируйте запрос с помощью printf. Сначала сам запрос, а потом паблик, вызываемый запросом. И посмотрите что не работает.
Скорее всего просто многопоточность всему виной. Запрос уходит в отдельном потоке и выполнение OnPlayerConnect продолжается.



Не предоставляю как записать через BlockIpAddress как его в базу записать через INSERT INTO подскажите пожалуйста

Ну посмотрите на параметры, блин. И почитайте о том, как работает функция. Вы же скриптер! Вы самостоятельно должны продумывать такие простые системы, раз уже работали с MySQL. Нужно лишь заняться тем, чем вы должны заняться - изучить принципы работы BlockIpAddress.

Данные о забаненных хранятся в памяти сервера до момента его полного отключения (по такому принципу BlockIpAddress работает). Значит при включении надо вновь заливать их. При старте сервера в main создаём запрос, который выгрузит ВСЕ данные из таблицы. После в паблике, вызванном запросом, проверяем время: если время бана прошло (gettime в помощь) - удаляем строку, иначе грузим данные из строки и вставляем в BlockIpAddress. Всё. Вот и вся система.
Только данные в таблице о разбаненных будут обновляться исключительно в момент запуска мода. Но оно не страшно для нас, ибо игрок всё равно сможет зайти на сервер если время в BlockIpAddress кончилось.

Возможно, что-то ещё забыл упомянуть. Но это сразу станет ясно, когда начнёте писать код

Kenny_Dalglish
30.05.2014, 12:58
Ну теперь прологируйте запрос с помощью printf. Сначала сам запрос, а потом паблик, вызываемый запросом. И посмотрите что не работает

- - - Добавлено - - -

Ну теперь прологируйте запрос с помощью printf. Сначала сам запрос, а потом паблик, вызываемый запросом. И посмотрите что не работает.
Скорее всего просто многопоточность всему виной. Запрос уходит в отдельном потоке и выполнение OnPlayerConnect продолжается.




Ну посмотрите на параметры, блин. И почитайте о том, как работает функция. Вы же скриптер! Вы самостоятельно должны продумывать такие простые системы, раз уже работали с MySQL. Нужно лишь заняться тем, чем вы должны заняться - изучить принципы работы BlockIpAddress.

Данные о забаненных хранятся в памяти сервера до момента его полного отключения (по такому принципу BlockIpAddress работает). Значит при включении надо вновь заливать их. При старте сервера в main создаём запрос, который выгрузит ВСЕ данные из таблицы. После в паблике, вызванном запросом, проверяем время: если время бана прошло (gettime в помощь) - удаляем строку, иначе грузим данные из строки и вставляем в BlockIpAddress. Всё. Вот и вся система.
Только данные в таблице о разбаненных будут обновляться исключительно в момент запуска мода. Но оно не страшно для нас, ибо игрок всё равно сможет зайти на сервер если время в BlockIpAddress кончилось.

Возможно, что-то ещё забыл упомянуть. Но это сразу станет ясно, когда начнёте писать код
Ну это все понятно, не понятно то как записывать BlockIpAddress в MySQL ну например BlockIpAddress("IP", params[0]); ставлю вот так но как его записать в MySQL то?

- - - Добавлено - - -

На счёт, OnIncomingConnection просто даже не вызывается регистрация...

DeimoS
30.05.2014, 13:37
Ну это все понятно, не понятно то как записывать BlockIpAddress в MySQL ну например BlockIpAddress("IP", params[0]); ставлю вот так но как его записать в MySQL то?

Эмм, просто IP и дату разбана в формате gettime. Всё.

Kenny_Dalglish
01.06.2014, 03:25
Эмм, просто IP и дату разбана в формате gettime. Всё.

Как все трудно :diablo:. Есть какой то более простой вариант что бы не переписывать систему

DeimoS
01.06.2014, 08:33
Как все трудно :diablo:. Есть какой то более простой вариант что бы не переписывать систему

Так чего трудного то? В базу данных записываем IP и текущую дату + то число секунд, которое должно пройти до того, как игрока разбанит (банальная математика).
Теперь при старте сервера делаем запрос и выгружаем каждую строку из таблицы, сразу же вставляя данные в функцию BlockIpAddress. Что-то типа


//Получаем данные IP и даты
//Если текущая дата больше или равна той, что указана в дате разбана - разблокируем аккаунт (удаляем строку из таблицы) и приступаем к обработке нового.
//Иначе...
BlockIpAddress(ip, (gettime() - time_ban)*1000);//time_ban - переменная, хранящая время разбана. А на 1000 умножаем для конвертации секунд в миллисекунды, с которыми работает функция
Всё. Вот и вся система.

Kenny_Dalglish
01.06.2014, 10:38
Так чего трудного то? В базу данных записываем IP и текущую дату + то число секунд, которое должно пройти до того, как игрока разбанит (банальная математика).
Теперь при старте сервера делаем запрос и выгружаем каждую строку из таблицы, сразу же вставляя данные в функцию BlockIpAddress. Что-то типа


//Получаем данные IP и даты
//Если текущая дата больше или равна той, что указана в дате разбана - разблокируем аккаунт (удаляем строку из таблицы) и приступаем к обработке нового.
//Иначе...
BlockIpAddress(ip, (gettime() - time_ban)*1000);//time_ban - переменная, хранящая время разбана. А на 1000 умножаем для конвертации секунд в миллисекунды, с которыми работает функция
Всё. Вот и вся система.
Только я Unix Time не юзаю :)

DeimoS
01.06.2014, 11:30
Только я Unix Time не юзаю :)

Стандартная функция.
По-другому никак не сделать то, что хотите сделать вы

underwoker
01.06.2014, 11:32
Даю подсказку. И чего в Unix Сложного?

data[16];
format(data, 16, "%s",date("%dd.%mm.%yyyy",gettime()));
printf("DATA BANA: %s", data);


new unbandate;
unbandate = gettime() + 15*86400;// берем текущую дату через gettime + 15(дней) умножаем на 86400(Это в секундах - сутки). Тоесть до разбана аккаунта 15 дней.
printf("AKKAUNT BYDET RAZBANEN: %d");//

Kenny_Dalglish
01.06.2014, 11:53
Даю подсказку. И чего в Unix Сложного?

data[16];
format(data, 16, "%s",date("%dd.%mm.%yyyy",gettime()));
printf("DATA BANA: %s", data);


new unbandate;
unbandate = gettime() + 15*86400;// берем текущую дату через gettime + 15(дней) умножаем на 86400(Это в секундах - сутки). Тоесть до разбана аккаунта 15 дней.
printf("AKKAUNT BYDET RAZBANEN: %d");//

Да потому что, я делаю что бы после рестарт все аккаунты разбанивало вот и не использую.

underwoker
01.06.2014, 13:23
Да потому что, я делаю что бы после рестарт все аккаунты разбанивало вот и не использую.
Так, я окончательно опух.
Зачем тогда вам дата нужна вообще?

Kenny_Dalglish
01.06.2014, 17:31
Так, я окончательно опух.
Зачем тогда вам дата нужна вообще?
Что бы по когда BanDay = 0 то удалить аккаунт из базы

DeimoS
01.06.2014, 19:18
Охх, я вам уже всё сказал. По-другому НИКАК не сделать то, что хотите вы. Вам так важно, чтоб имя сервера не писало что-ли? Именно чтоб имя? Если да, то влепите в OnPlayerConnect

for(new i; i < 30; i++) SendClientMessage(playerid, -1, " ");
и пощадите уже наши грешные души