Предотвращение атаки типа «отказ в обслуживании» - PullRequest
5 голосов
/ 09 августа 2010

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

Спасибо и всего наилучшего,

мышиный.

Ответы [ 3 ]

3 голосов
/ 09 августа 2010

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

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

1 голос
/ 09 августа 2010

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

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

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

1 голос
/ 09 августа 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...