方法是在会话中存储一个计数器,并使用该计数器来防止每次调用过多。
但是,如果您的用户可能会尝试避免这种情况并每次发送不同的 cookie*,那么您需要创建一个自定义表,其行为类似于会话,但将用户与 ip 连接,而不是与 cookie。
这里还有一个问题是,如果您在 ip 上阻止 basic,您可能会阻止整个公司从代理中出来。所以最后一个正确但更复杂的方法是让ip和cookie都与用户连接并知道浏览器是否允许cookie。如果没有,那么你用 ip 阻止。这里的困难部分是了解 cookie。 您可以在每次通话时强制他发送与现有会话相关的有效 cookie。如果没有,则浏览器没有 cookie。
[ * ] cookie 与会话连接。
[ * ] 通过创建新表来保持计数器并与会话断开连接,您还可以避免会话锁定。
过去我使用了用于 DosAttack 的代码,但是当您有很多池和困难的应用程序时,它们都不能正常工作,所以我现在使用我描述的自定义表。这是我测试和使用的两个代码
Dos attacks in your web app
Block Dos attacks easily on asp.net
如何查找保存在表格中的每秒点击次数。这是我的 SQL 计算每秒点击次数的部分。诀窍之一是,如果距离最后一次检查还有 6 秒或更多秒,我会继续添加点击次数并计算平均值。这是从计算中截取的代码作为一个想法
set @cDos_TotalCalls = @cDos_TotalCalls + @NewCallsCounter
SET @cMilSecDif = ABS(DATEDIFF(millisecond, @FirstDate, @UtpNow))
-- I left 6sec diferent to make the calculation
IF @cMilSecDif > 6000
SET @cClickPerSeconds = (@cDos_TotalCalls * 1000 / @cMilSecDif)
else
SET @cClickPerSeconds = 0
IF @cMilSecDif > 30000
UPDATE ATMP_LiveUserInfo SET cDos_TotalCalls = @NewCallsCounter, cDos_TotalCallsChecksOn = @UtpNow WHERE cLiveUsersID=@cLiveUsersID
ELSE IF @cMilSecDif > 16000
UPDATE ATMP_LiveUserInfo SET cDos_TotalCalls = (cDos_TotalCalls / 2),
cDos_TotalCallsChecksOn = DATEADD(millisecond, @cMilSecDif / 2, cDos_TotalCallsChecksOn)
WHERE cLiveUsersID=@cLiveUsersID