Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > AntiFlood как реализовать? |
Автор: azesmcar 13.4.2009, 14:22 | ||||||
Добрый день, Есть серверная система. Есть class ServerSocket и class SocketUser. Нужно реализовать антифлуд на сокетах. Т.е. если пользователь начал флудить - отключить его, при рецидиве - заблокировать АЙПИ к примеру. Вот только не приходит на ум как это реализовать.
только беда в том что нужно иметь данные о прежних сообщениях пользователя. A где их хранить? В классе SocketUser?
Нелогично как-то получается спрашивать у пользователя а не флудит ли он? Хранить для этого отдельный контейнер? (ну или адаптер на контейнер)
Тоже не очень, так как придется каждый раз снова искать его в контейнерe, притом что пользователь передан событию как параметр и если запихнуть эти данные в него - получится оптимальнее (но некрасиво) ![]() Вот вобщем-то и вопрос. Спасибо заранее |
Автор: azesmcar 13.4.2009, 15:38 | ||
Суть не в том что пользователь может сказать правду или не правду. Суть в том что с точки зрения логики распределения обязанностей классов - роль проверки "флуда пользователя" не подходит классу самого пользователя. |
Автор: Lazin 13.4.2009, 18:49 |
мне кажется это нужно делать не на уровне SocketUser а намного выше, я не знаю что это за приложение, но если это что-то вроде мессенджера, то у тебя все-равно будет какой-либо компонент, который будет хранить историю сообщений, какую-либо информацию о пользователе и тд, вот где-то там это и нужно реализовывать |
Автор: azesmcar 13.4.2009, 19:02 | ||
Lazin Точно! Это не совсем мессенджер, но один из сервисов приложения - обмен текстовыми сообщениями. Я хочу построить антифлуд на уровне базового сервиса..т.е. чтобы он работал для каждого сервиса. Хоть какая-то базовая защита от дос атаки. Компоненты высокого уровня есть, и в принципе они могут это проверить но только из базы данных. Поиск по базе - операция медленная, делать это для каждого сообщения не хотелось бы делать..да и в map придется делать поиск по пользователю, правда там он будет намного быстрее. Наверное так и сделаю, так как пока другого выхода не вижу. Т.е. выходит этот вариант?
|
Автор: Lazin 13.4.2009, 20:57 |
ну, защита от перегрузки и защита от флуда это разные вещи, флуд это из той-же категории что и спам - анализ поведения пользователя, а защита на уровне соединения может выглядеть так: у продюсера есть очередь с сообщениями, мы добавляем туда сообщения методом push, а другой поток, достает оттуда сообщения и отправляет их (он может реализовывать алгоритм Нагеля или нет, не суть выжно...), если во время вызова push размер очереди превышает некоторый порог, метод push блокируется, и не возвращает управление, пока другой поток не выберет все сообщения и не отправит их потребителю. В этом случае скорость, с которой данные могут быть отправлены, будет зависеть от того, с какой скоростью они могут быть обработаны. ![]() |
Автор: azesmcar 13.4.2009, 21:04 | ||
Lazin Ну флуд это одна из разновидностей ДОС атаки.
А вот насчет очереди мысль интересная...можно реализовать. Только вот контейнер queue в стандарт не вошел. Надо будет написать адаптер видимо (не люблю не стандартных решений) ![]() В принципе если в очереди пользователя больше чем N-ое число необработанных сообщений разница во времени между которыми не более секунды - это флуд. Адаптер очереди может имплементировать патерн State и перевести в состояние Blocked - как только flood detected. Думаю сойдет, спасибо. |
Автор: zim22 13.4.2009, 21:32 |
вы уверены что не вошёл? 23.2.3.1. Class template queue |
Автор: Lazin 13.4.2009, 21:52 |
тут нужна несколько другая очередь Добавлено через 3 минуты и 25 секунд concurrent_queue из intel threading building blocks, или просто порт завершения |
Автор: azesmcar 13.4.2009, 21:56 | ||
zim22 Интересный вопрос..я был уверен что - не вошел Эффективное использование STL ![]() а вот стандарт... ![]() ![]() Добавлено через 1 минуту и 24 секунды
Завтра во время реализации разберусь..главное идея ![]() |
Автор: Любитель 13.4.2009, 23:11 |
azesmcar, в твоей цитате речь о другом. Что есть стандартные контейнеры, но они строго говоря не являются STL-совместимыми (всякие begin, end и прочее) по тем или иным причинам. |
Автор: azesmcar 14.4.2009, 00:34 | ||||||
Любитель Фразу "контейнер queue не относится к STL (стандартной библиотеке C++)" понимать как "не является STL совместимым?" Я почему-то понимаю ее как - не вошла в стандарт. Но в стандарте ясно сказано
И среди них stack, queue, bitset ... Так как то что
? Добавлено через 2 минуты и 13 секунд Модераторам: Нельзя ли вынести тему связанную сo стандартностью queue вынести в отдельную? Спасибо ![]() |
Автор: Любитель 14.4.2009, 00:59 |
STL - это часть стандартной библиотеки. Хотя в любом случае фраза из книги звучит немного кривовато ![]() |
Автор: azesmcar 14.4.2009, 08:27 |
Любитель Видимо перевод неудачный. Если глубоко вникнуть - понять можно, но я ее давно читал..как понял так и запечатлелась ![]() Ладно спасибо, посмотрю оригинал Мейерса по этому вопросу. |
Автор: zim22 14.4.2009, 08:58 | ||||
русские переводы книг - это зло. вот пример из книги, которую я сейчас читаю:
в оригинале это было так:
|
Автор: azesmcar 14.4.2009, 09:02 |
zim22![]() |