Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> AntiFlood как реализовать? 
V
    Опции темы
azesmcar
Дата 13.4.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Добрый день,

Есть серверная система. Есть class ServerSocket и class SocketUser. Нужно реализовать антифлуд на сокетах. Т.е. если пользователь начал флудить - отключить его, при рецидиве - заблокировать АЙПИ к примеру.
Вот только не приходит на ум как это реализовать. 
Код

void ServerSocket::OnUserAction(SocketUser* user)
{
   //тут надо проверить не флудит ли пользователь прежде чем вызввать обработчика
   actionHandlers->ExecuteCorrespondingHandler( SocketUser->Message()->Type );
}


только беда в том что нужно иметь данные о прежних сообщениях пользователя. A где их хранить? В классе SocketUser?
Код

void ServerSocket::OnUserAction(SocketUser* user)
{
   if ( user->AreYouFlooding() )
      user->GoToHell();

   actionHandlers->ExecuteCorrespondingHandler( SocketUser->Message()->Type );
}

Нелогично как-то получается спрашивать у пользователя а не флудит ли он?
Хранить для этого отдельный контейнер? (ну или адаптер на контейнер)
Код

void ServerSocket::OnUserAction(SocketUser* user)
{
   floodChecker_->AddUserMessage( user );
   if ( floodChecker_->IsFlooding( user ) )
      user->GoToHell();

   actionHandlers->ExecuteCorrespondingHandler( SocketUser->Message()->Type );
}

Тоже не очень, так как придется каждый раз снова искать его в контейнерe, притом что пользователь передан событию как параметр и если запихнуть эти данные в него - получится оптимальнее (но некрасиво) smile 

Вот вобщем-то и вопрос.

Спасибо заранее

Это сообщение отредактировал(а) azesmcar - 13.4.2009, 15:32
PM   Вверх
andrew_121
Дата 13.4.2009, 15:24 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(azesmcar @  13.4.2009,  14:22 Найти цитируемый пост)
Нелогично как-то получается спрашивать у пользователя а не флудит ли он?

Да. А он взял и правду сказал. И правда не логично smile 

И еще. Многова не понятно. Знаки препинания расставьте. smile 



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
azesmcar
Дата 13.4.2009, 15:38 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

Да. А он взял и правду сказал. И правда не логично smile 


Суть не в том что пользователь может сказать правду или не правду. Суть в том что с точки зрения логики распределения обязанностей классов - роль проверки "флуда пользователя" не подходит классу самого пользователя.
PM   Вверх
Lazin
Дата 13.4.2009, 18:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



мне кажется это нужно делать не на уровне SocketUser а намного выше, я не знаю что это за приложение, но если это что-то вроде мессенджера, то у тебя все-равно будет какой-либо компонент, который будет хранить историю сообщений, какую-либо информацию о пользователе и тд, вот где-то там это и нужно реализовывать
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 13.4.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Lazin

Точно! Это не совсем мессенджер, но один из сервисов приложения - обмен текстовыми сообщениями. Я хочу построить антифлуд на уровне базового сервиса..т.е. чтобы он работал для каждого сервиса. Хоть какая-то базовая защита от дос атаки.

Компоненты высокого уровня есть, и в принципе они могут это проверить но только из базы данных.
Поиск по базе - операция медленная, делать это для каждого сообщения не хотелось бы делать..да и в map придется делать поиск по пользователю, правда там он будет намного быстрее.
Наверное так и сделаю, так как пока другого выхода не вижу. Т.е. выходит этот вариант?

Код

void ServerSocket::OnUserAction(SocketUser* user)
{
   floodChecker_->AddUserMessage( user );
   if ( floodChecker_->IsFlooding( user ) )
      user->GoToHell();
   actionHandlers->ExecuteCorrespondingHandler( SocketUser->Message()->Type );
}



Это сообщение отредактировал(а) azesmcar - 13.4.2009, 19:03
PM   Вверх
Lazin
Дата 13.4.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(azesmcar @  13.4.2009,  19:02 Найти цитируемый пост)
защита от дос атаки

ну, защита от перегрузки и защита от флуда это разные вещи, флуд это из той-же категории что и спам - анализ поведения пользователя, а защита на уровне соединения может выглядеть так: у продюсера есть очередь с сообщениями, мы добавляем туда сообщения методом push, а другой поток, достает оттуда сообщения и отправляет их (он может реализовывать алгоритм Нагеля или нет, не суть выжно...), если во время вызова push размер очереди превышает некоторый порог, метод push блокируется, и не возвращает управление, пока другой поток не выберет все сообщения и не отправит их потребителю. В этом случае скорость, с которой данные могут быть отправлены, будет зависеть от того, с какой скоростью они могут быть обработаны. smile 
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 13.4.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Lazin

Ну флуд это одна из разновидностей ДОС атаки. 
Цитата

    * Флуд (англ. flood) — атака, связанная с большим количеством обычно бессмысленных или сформированных в неправильном формате запросов к компьютерной системе или сетевому оборудованию, имеющая своей целью или приведшая к отказу в работе системы из-за исчерпания ресурсов системы — процессора, памяти либо каналов связи.


А вот насчет очереди мысль интересная...можно реализовать. Только вот контейнер queue в стандарт не вошел. Надо будет написать адаптер видимо (не люблю не стандартных решений) smile
В принципе если в очереди пользователя больше чем N-ое число необработанных сообщений разница во времени между которыми не более секунды - это флуд. Адаптер очереди может имплементировать патерн State и перевести в состояние Blocked - как только flood detected.
Думаю сойдет, спасибо.
PM   Вверх
zim22
Дата 13.4.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(azesmcar @  13.4.2009,  21:04 Найти цитируемый пост)
Только вот контейнер queue в стандарт не вошел

вы уверены что не вошёл?
23.2.3.1. Class template queue


--------------------
PM MAIL   Вверх
Lazin
Дата 13.4.2009, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



тут нужна несколько другая очередь

Добавлено через 3 минуты и 25 секунд
concurrent_queue из intel threading building blocks, или просто порт завершения
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 13.4.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



zim22

Интересный вопрос..я был уверен что - не вошел

Эффективное использование STL
user posted image

а вот стандарт...
user posted image

 smile

Добавлено через 1 минуту и 24 секунды
Цитата

тут нужна несколько другая очередь


Завтра во время реализации разберусь..главное идея smile
PM   Вверх
Любитель
Дата 13.4.2009, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



azesmcar, в твоей цитате речь о другом. Что есть стандартные контейнеры, но они строго говоря не являются STL-совместимыми (всякие begin, end и прочее) по тем или иным причинам.


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 14.4.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Любитель

Фразу "контейнер queue не относится к STL (стандартной библиотеке C++)" понимать как "не является STL совместимым?"
Я почему-то понимаю ее как - не вошла в стандарт. Но в стандарте ясно сказано
Цитата

The C++ Standard library provides 32 C++ headers, as shown in table 11. 

И среди них stack, queue, bitset ...

Так как то что
Цитата

provides standard C++ library

Цитата

не относится к STL

?

Добавлено через 2 минуты и 13 секунд
Модераторам: Нельзя ли вынести тему связанную сo стандартностью queue вынести в отдельную?

Спасибо smile 

Это сообщение отредактировал(а) azesmcar - 14.4.2009, 00:36
PM   Вверх
Любитель
Дата 14.4.2009, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



STL - это часть стандартной библиотеки. Хотя в любом случае фраза из книги звучит немного кривовато smile std::queue - самый что ни на есть стандартный контейнер (ну или, как принято говорить, контейнерный адаптер).


--------------------
PM MAIL ICQ Skype   Вверх
azesmcar
Дата 14.4.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Любитель
Видимо перевод неудачный. Если глубоко вникнуть - понять можно, но я ее давно читал..как понял так и запечатлелась smile
Ладно спасибо, посмотрю оригинал Мейерса по этому вопросу.
PM   Вверх
zim22
Дата 14.4.2009, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(azesmcar @  14.4.2009,  08:27 Найти цитируемый пост)
Видимо перевод неудачный

русские переводы книг - это зло.
вот пример из книги, которую я сейчас читаю:
Код

for (Node *p = node->next; p; / * удаление */) { ... }

в оригинале это было так:
Код

for (Node *p = node->next; p; / * empty */) { ... }



--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1249 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.