TIdHttpServer и время ожидания сокета - PullRequest
1 голос
/ 23 октября 2019

У меня есть приложение, использующее TIdHttpServer. Как установить таймаут для медленных сокетов при написании сообщений?

Недавнее сканирование безопасности моего приложения выявило некоторые уязвимости, связанные с подключением клиентов к веб-серверу. Основная уязвимость заключалась в том, что клиенты, отправляющие медленные запросы на сервер, не отбрасывались. Чтобы исправить это, я добавил ReadTimeout к клиентским соединениям в событии OnConnect сервера.

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

После добавления этого изменения более новое сканирование безопасности показало, что сервер сбрасывает тайм-аут после приема пакета изклиент. Чтобы решить эту проблему, я пытаюсь найти способ установить тайм-аут записи для сокетов, а не показанный ReadTimeout. Другими словами, я не хочу, чтобы данные для записи в сокет обновляли тайм-аут, который контролирует разрыв соединения. Можно ли это сделать?

1 Ответ

1 голос
/ 24 октября 2019

ReadTimeout применяется при каждой попытке чтения байтов из соединения. Каждое чтение использует полный тайм-аут. Думайте об этом как на байт тайм-аут.

В настоящее время нет на запрос тайм-аут в TIdHTTPServer, чтобы ограничить количество времени, которое ему разрешенопрочитайте полный HTTP-запрос.

Чтобы получить нечто подобное, попробуйте следующее:

  • установите для свойства сервера KeepAlive значение Falseчтобы запретить несколько HTTP-запросов на одно TCP-соединение (TIdHTTPServer не имеет события, указывающего, когда начинается новый HTTP-запрос).

  • в серверном событии OnConnect, установите ReadTimeout на время ожидания начала HTTP-запроса и запуска таймера для общего времени ожидания, требуемого для всего запроса.

  • в OnCommand... и * сервера1031 * событий, остановите таймер, если он работает.

  • , если таймер истек, закройте сокет.

...