【问题标题】:TIdHttpServer and Socket TimeoutTIdHttpServer 和套接字超时
【发布时间】:2020-02-20 04:11:36
【问题描述】:

我有一个使用 TIdHttpServer 的应用程序。如何为写入消息缓慢的套接字设置超时?

最近对我的应用程序进行的安全扫描发现了一些与连接到网络服务器的客户端有关的漏洞。主要漏洞是向服务器发送慢速请求的客户端没有被丢弃。为了解决这个问题,我在服务器的 OnConnect 事件中将 ReadTimeout 添加到客户端连接。

procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
begin
  AContext.Connection.Socket.ReadTimeout := 15000;
end;

添加此更改后,更新的安全扫描显示服务器在接受来自客户端的数据包后重置超时。为了解决这个问题,我试图想出一种方法来为套接字建立写超时,而不是显示的 ReadTimeout。换句话说,我不希望套接字写入数据来刷新控制连接被丢弃的超时。这个可以吗?

【问题讨论】:

    标签: sockets delphi timeout indy httpserver


    【解决方案1】:

    ReadTimeout 适用于每次尝试从连接中读取字节。每次读取都使用完全超时。将其视为每字节超时。

    TIdHTTPServer 目前没有每个请求超时来限制允许读取完成 HTTP 请求的时间量。

    要获得类似的东西,试试这个:

    • 将服务器的 KeepAlive 属性设置为 False 以禁止每个 TCP 连接有多个 HTTP 请求(TIdHTTPServer 没有指示新 HTTP 请求何时开始的事件)。

      李>
    • 在服务器的OnConnect 事件中,将ReadTimeout 设置为您希望等待 HTTP 请求开始的时间,并为整个请求所需的总超时时间启动一个计时器。

    • 在服务器的OnCommand...OnDisconnect 事件中,如果计时器正在运行,则停止它。

    • 如果定时器超时,关闭套接字连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-28
      相关资源
      最近更新 更多