Dav*_*uli 9 c# asp.net web-services
我为我的客户提供了一个Web服务,允许他将记录添加到生产数据库中.
我最近遇到了一个事件,我的客户程序员在一个循环中调用该服务,迭代调用我的服务数千次.
我的问题是什么是防止这种事情的最佳方法.
我想到了一些方法:1.对服务的参与,我可以为每个调用该服务的客户更新计数器,但这看起来太过于笨拙.2.检查呼叫此服务的客户端的IP,并在每次呼叫服务时提出标志,然后每小时重置一次标志.
我很肯定有更好的方法,并会提出任何建议.
谢谢,大卫
方法是在会话中存储一个计数器,并使用该计数器来防止每次调用过多。
但是,如果您的用户可能试图避免这种情况并每次发送不同的 cookie*,那么您需要创建一个自定义表,其行为类似于会话,但将用户与 ip 连接,而不是与 cookie 连接。
这里还有一个问题是,如果你阻止基本 IP,你可能会阻止来自代理的整个公司。所以最终正确但更复杂的方法是让ip和cookie与用户连接并知道浏览器是否允许cookie。如果没有,那么你用ip阻止。这里的困难部分是了解 cookie。那么在每次调用时,您都可以强制他发送一个与现有会话连接的有效 cookie。如果没有,则浏览器没有 cookie。
[ * ] cookie 与会话相关。
[ * ] 通过创建新表来保留计数器并与会话断开连接,您还可以避免会话锁定。
过去,我使用过用于 DosAttack 的代码,但是当您有很多池和困难的应用程序时,它们都无法正常工作,因此我现在使用我所描述的自定义表。这是我测试和使用的两个代码
如何查找表中保存的每秒点击次数。这是我的 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3090 次 |
| 最近记录: |