避免拒绝服务攻击

7
当我使用Windows套接字中的recv函数时,使用recv会导致拒绝服务攻击吗?如果它永远等待数据怎么办?那么解决这个问题的最佳方法是什么(警报?)。
谢谢和问候,
Mousey。
3个回答

3
你好像误解了什么是拒绝服务攻击。一个例子就是大量的HTTP请求发送到单个Web服务器,以致于这些请求的速率变得非常快,导致Web服务器软件变得非常繁忙,无法接受新的TCP连接。维基百科有一篇不错的文章介绍DoS,可以去看看。 recv(2)只是一个API。与其他漏洞一样,滥用它可能会导致问题,包括DoS。但这并不意味着你应该避免使用它。如果你的问题是在等待读取时阻塞了其他套接字,请尝试使用非阻塞套接字I/O多路复用,例如select(2)poll(2)epoll(4)

1
是的,我想知道如果我使用recv()会不会导致DoS攻击?因为服务器可能会在等待它很长时间。例如,如果我的消息大小非常大。 - mousey
请注意,可以在套接字上设置超时时间和在接收时设置最大缓冲区大小,以便限制滥用的机会。我猜如果您只有一个进程,那么不受欢迎的对等方可能会以拒绝服务攻击的方式缓慢地向您发送大量字节... - MZB

1

是的,recv() 可能会无限期地阻塞。您需要实现某种形式的超时。

我建议使用 boost asio 库。它包括与套接字连接和接收事件无缝配合工作的计时器等内容。只需设置异步套接字、添加计时器,并在时间耗尽时中断即可。

这仍然不能使您免受 DoS 攻击的影响,因为在超时窗口期间仍可能出现大量请求。但如果将超时时间设置得很短,则可能有所帮助。


1
如果您正在使用阻塞套接字,请考虑使用SO_SNDTIMEO和SO_RCVTIMEO setsockopt() 选项调整send()和recv()超时。
创建适当的服务器有许多小的复杂性,可以尝试借鉴或使用这个多线程套接字服务器示例
如果您控制双方(客户端和服务器套接字软件),则可以创建一种协议,其中要传递的消息长度作为消息的前2或4个字节,这样您只需要阻塞解码该数字并继续读取,直到字节数已经过去。对于客户端和服务器都可以这样做,这将使您的代码简单得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接