避免拒绝服务攻击

当我使用recv从Windows套接字使用recv可以导致拒绝服务攻击? 如果它永远等待数据? 那么解决这个问题的最好方法是什么(警报?)

感谢和问候,

像老鼠。

你似乎不明白拒绝服务的含义。 一个例子是大量的HTTP请求到一个单一的网络服务器到达的速度,以至于网络服务器软件变得如此繁忙,不能接受新的TCP连接。 维基百科在DoS上有一个体面的文章,阅读它。

recv(2)只是一个API。 与其他任何错误一样,误用它可能会导致问题,包括DoS。 但这并不意味着你应该避免它。 如果您的问题在等待读取时阻塞了其他套接字,请像select(2)poll(2)epoll(4)那样查看非阻塞套接字I / O复用

是的, recv()可以无限期地阻塞。 你需要执行某种时间。

我会建议使用boost asio库 。 它包括诸如与套接字连接无缝工作并接收事件的定时器之类的东西。 只需设置一个异步套接字,添加一个计时器,如果时间用完,就会中断。

这仍然不会使您免于DoS攻击,因为在超时窗口期间仍然会涌入大量请求。 但是,如果你设置的时间很短,可能会有所帮助。

如果使用阻塞套接字,请查看使用SO_SNDTIMEO和SO_RCVTIMEO setsockopt()选项调整send()和recv()超时。

创建一个合适的服务器有很多复杂性,我会考虑通过乞讨,借用或者窃取这个服务来获得。 这是一个示例多线程套接字服务器 。

另外,如果你有控制双方(客户端和服务器套接字软件),我会创建一个协议,消息的长度作为消息的前2或4个字节传递,这样,你只需要阻止为了解码数字,并保持读取,直到经过的字节数。 对客户端和服务器都这样做,它会让你的代码简单得多。