2010-08-09 15 views
5

kiedy używam recv z gniazdek systemu Windows, czy używanie recv może prowadzić do ataku typu odmowa usługi? Jeśli czeka na dane na zawsze? Więc co jest najlepszym sposobem rozwiązania tego (alarmy?)Unikanie ataku Denial of Service

Dzięki & Pozdrawiam,

mouseY.

Odpowiedz

3

Wydaje się, że źle rozumiesz, co oznacza odmowa usługi. Przykładem może być duża liczba żądań HTTP do pojedynczego serwera WWW osiągających taką szybkość, że oprogramowanie serwera sieciowego staje się tak zajęte, że nie może akceptować nowych połączeń TCP. Wikipedia ma przyzwoity artykuł na temat DoS, przeczytaj.

recv(2) to tylko API. Nadużywanie jej, jak każdy inny błąd, może prowadzić do problemów, w tym DoS. Ale to nie znaczy, że powinieneś tego unikać. Jeśli problem polega na blokowaniu innych gniazd podczas oczekiwania na odczyt, spójrz na nieblokujące gniazda i multipleksowanie I/O jak w select(2), poll(2) i epoll(4).

+1

tak Chcę wiedzieć, czy używam recv() może to prowadzić do DoS? Ponieważ serwer może czekać na to przez długi czas. Na przykład, jeśli mój rozmiar wiadomości jest bardzo duży. – mousey

+0

Należy pamiętać, że można ustawić limit czasu dla gniazda i maksymalny rozmiar bufora na recv, więc możliwości nadużyć mogą być ograniczone. Przypuszczam, że jeśli masz pojedynczy proces, niechciany rówieśnik może wysłać ci wiele bajtów powoli jako atak odmowy usługi ... – MZB

1

Tak, recv() może blokować w nieskończoność. Musisz zaimplementować jakiś limit czasu.

Polecam korzystanie z boost asio library. Obejmuje to takie funkcje, jak liczniki czasu, które działają bezproblemowo z połączeniami gniazdowymi i odbierają zdarzenia. Wystarczy ustawić gniazdo asynchroniczne, dodać zegar i przerwać, jeśli skończy się czas.

To nadal nie powoduje, że jesteś odporny na ataki DoS, ponieważ zalew żądań może nadal pojawiać się w oknie limitu czasu. Ale jeśli może pomóc, jeśli limit czasu jest dość niski.

1

Jeśli używasz blokujących gniazd, spójrz na regulację limitów wysyłania() i recv() za pomocą opcji SO_SNDTIMEO i SO_RCVTIMEO setsockopt().

Istnieje wiele małych skomplikowań w tworzeniu właściwego serwera, chciałbym sprawdzić, czy to przez żebranie, pożyczanie lub kradzież tego. Oto sample multithreaded socket server.

Również, jeśli masz kontrolę nad obiema stronami (oprogramowanie gniazdka klienta i serwera), utworzę protokół, który będzie miał długość wiadomości do przekazania jako pierwsze 2 lub 4 bajty wiadomości, w ten sposób po prostu trzeba zablokować, aby dekodować tę liczbę i kontynuować czytanie aż do liczby bajtów, które minęły. Zrób to zarówno dla klienta, jak i serwera, co znacznie uprości kod.

Powiązane problemy