smarter DoS-preventing grace period

This commit is contained in:
Massimo Melina 2020-06-08 12:40:00 +02:00
parent 1fc5894204
commit 782702c192

View File

@ -1,4 +1,4 @@
{ {
Copyright (C) 2002-2014 Massimo Melina (www.rejetto.com) Copyright (C) 2002-2014 Massimo Melina (www.rejetto.com)
This file is part of HFS ~ HTTP File Server. This file is part of HFS ~ HTTP File Server.
@ -3607,17 +3607,21 @@ var
const ip2availability: Tdictionary<string,Tdatetime> = NIL; const ip2availability: Tdictionary<string,Tdatetime> = NIL;
const folderConcurrents: integer = 0; const folderConcurrents: integer = 0;
const MAX_CONCURRENTS = 3;
procedure updateAvailability(); procedure updateAvailability();
var var
pair: Tpair<string,Tdatetime>; pair: Tpair<string,Tdatetime>;
t: Tdatetime; t: Tdatetime;
begin begin
dec(folderConcurrents);
t:=now(); t:=now();
ip2availability[cd.address]:=t+1/SECONDS; if folderConcurrents = MAX_CONCURRENTS then // serving multiple addresses at max capacity, let's give a grace period for others
ip2availability[cd.address]:=t + 1/SECONDS
else
ip2availability.Remove(cd.address);
dec(folderConcurrents);
// purge leftovers // purge leftovers
for pair in ip2availability do for pair in ip2availability do
if pair.Value < t then if pair.Value < t then
ip2availability.Remove(pair.Key); ip2availability.Remove(pair.Key);
end; end;
@ -3631,7 +3635,7 @@ const folderConcurrents: integer = 0;
exit(FALSE); exit(FALSE);
except except
end; end;
if folderConcurrents >= 3 then // max number of concurrent folder loading, others are postponed if folderConcurrents >= MAX_CONCURRENTS then // max number of concurrent folder loading, others are postponed
exit(FALSE); exit(FALSE);
inc(folderConcurrents); inc(folderConcurrents);
ip2availability.AddOrSetValue(cd.address, now()+1); ip2availability.AddOrSetValue(cd.address, now()+1);