2010-08-09 2 views
5

Когда я использую recv из оконных сокетов, использование recv может привести к атаке отказа в обслуживании? Если он ожидает данных навсегда? Так что это лучший способ для решения этих (сигнализаций?)Избегайте атаки на отказ в обслуживании

Благодаря & С уважением,

мышиных.

ответ

3

Вы, кажется, неправильно понимаете, что означает отказ в обслуживании. Примером может служить большое количество HTTP-запросов к одному веб-серверу, достигающему такой скорости, что программное обеспечение веб-сервера становится настолько занятым, что не может принимать новые TCP-соединения. У Википедии есть достойная статья на DoS, прочитайте ее.

recv(2) - это всего лишь API. Неправильное использование, как и любая другая ошибка, может привести к проблемам, включая DoS. Но это не значит, что вам следует избегать этого. Если ваша проблема блокирует другие розетки во время ожидания на чтение, смотреть в без блокирующих сокетов и I/O мультиплексирование как в select(2), poll(2) и epoll(4).

+1

да, я хочу знать, пользуюсь ли recv(), может ли это привести к DoS? Поскольку сервер может долго ждать его. Например, если размер моего сообщения очень большой. – mousey

+0

Обратите внимание, что можно установить тайм-аут в сокете и максимальный размер буфера на recv, поэтому возможности для злоупотреблений могут быть ограничены. Я думаю, если у вас есть один процесс, нежелательный сверстник может отправить вам много байтов медленно, так как атака отказа в обслуживании ... – MZB

1

Да, recv() может блокироваться бесконечно. Вам нужно реализовать какой-то тайм-аут.

Я бы рекомендовал использовать boost asio library. Он включает в себя такие вещи, как таймеры, которые работают без сбоев с соединениями сокетов и принимают события. Просто настройте асинхронный сокет, добавьте таймер и сломайте, если время закончится.

Это все еще не делает вас неуязвимыми для DoS-атак, поскольку поток запросов может появиться во время тайм-аута. Но если это поможет, если вы установите тайм-аут довольно низко.

1

Если вы используете блокирующие сокеты, посмотрите, как настроить тайм-ауты отправки() и recv() с параметрами SO_SNDTIMEO и SO_RCVTIMEO setsockopt().

Существует множество небольших сложностей при создании надлежащего сервера, я бы посмотрел на приобретение, попрошайничество, заимствование или кража этого. Вот sample multithreaded socket server.

Также, если у вас есть контроль над обеими сторонами (программное обеспечение для сокетов клиента и сервера), я бы создал протокол, длина которого должна быть передана в качестве первых 2 или 4 байта сообщения, таким образом, вы просто нужно заблокировать это декодирование номера и продолжить чтение до тех пор, пока количество байтов не исчезнет. Сделайте это как для клиента, так и для сервера, и это сделает ваш код намного проще.

Смежные вопросы