我有一个使用TIdHttpServer的应用程序。如何为写消息缓慢的套接字设置超时时间?
最近对我的应用程序进行的安全扫描显示了一些与连接到Web服务器的客户端有关的漏洞。主要漏洞是发送到服务器的慢速请求的客户端没有被丢弃。为了解决此问题,我在服务器的OnConnect事件中向客户端连接添加了ReadTimeout。
procedure TForm1.IdHTTPServer1Connect(AContext: TIdContext);
begin
AContext.Connection.Socket.ReadTimeout := 15000;
end;
添加此更改后,更新的安全扫描显示服务器在接受来自客户端的数据包后重置超时。为了解决此问题,我试图提出一种为套接字建立写超时的方法,而不是所示的ReadTimeout。换句话说,我不希望套接字写数据刷新控制断开连接的超时。能做到吗?
ReadTimeout
适用于每次尝试从连接读取字节的尝试。每次读取都使用完整的超时。将其视为per-byte超时。
TIdHTTPServer
中目前没有per-request超时来限制读取complete HTTP请求所允许的时间。
要获得类似的内容,请尝试以下操作:
设置TIdHTTPServer.KeepAlive=False
(因为当TIdHTTPServer
时新的HTTP请求开始时KeepAlive=True
没有事件)
在OnConnect
事件中,设置ReadTimeout
并启动计时器
在OnCommand...
事件中停止计时器
如果计时器过去,请关闭套接字连接。