【问题标题】:Avoiding Denial of Service attack避免拒绝服务攻击
【发布时间】:2010-08-09 01:38:26
【问题描述】:

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

感谢和问候,

鼠标。

【问题讨论】:

    标签: c++ c windows sockets


    【解决方案1】:

    您似乎误解了拒绝服务的含义。例如,对单个 Web 服务器的大量 HTTP 请求以这样的速度到达,以至于 Web 服务器软件变得如此繁忙以至于无法接受新的 TCP 连接。维基百科在DoS 上有一篇不错的文章,请阅读。

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

    【讨论】:

    • 是的,我想知道如果我使用 recv() 会导致 DoS 吗?由于服务器可能会等待很长时间。例如,如果我的消息非常大。
    • 请注意,可以在套接字上设置超时和在 recv 上设置最大缓冲区大小,这样可以限制滥用的机会。我想如果你有一个进程,一个不需要的对等方可能会因为拒绝服务攻击而缓慢地向你发送大量字节......
    【解决方案2】:

    是的,recv() 可以无限期阻止。您需要实现某种超时。

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

    这仍然不能让您免受 DoS 攻击,因为在超时窗口期间仍可能会涌入大量请求。但是,如果您将超时设置得非常低,可能会有所帮助。

    【讨论】:

      【解决方案3】:

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

      创建一个合适的服务器有很多小复杂性,我会考虑通过乞讨、借用或偷窃来获得。这是sample multithreaded socket server

      此外,如果您可以控制双方(客户端和服务器套接字软件),我将创建一个协议,该协议将消息的长度作为消息的前 2 或 4 个字节传入,这样您只需必须阻止该解码数字并继续读取,直到经过的字节数。对客户端和服务器都这样做,这将使您的代码更简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-21
        • 2014-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-27
        • 1970-01-01
        相关资源
        最近更新 更多