我应该使用Sleep()还是拒绝它们

时间:2011-07-26 23:19:42

标签: php sleep rate-limiting

我正在实施延迟系统,以便任何我认为滥用的IP将通过Sleep()自动获得增量延迟。

我的问题是,如果攻击者只是在延迟时打开新实例,这是否会导致CPU使用率增加并因此终止我的网站?或者sl​​eep()命令使用最小的CPU /内存,并且不会对小脚本造成太大负担。我不想拒绝他们,因为我宁愿他们不明白地知道这个限制,但愿意听到我为什么要这样做。

[请不要讨论为什么我认为在一个小网站上滥用知识产权,导致为什么:我最近建立了一个脚本,cURL是一个页面&将信息返回给用户,我注意到有几个IP垃圾邮件我的愚蠢的小脚本。过于频繁地使用有时会使我的结果无法从服务器即时轮询中获得,并且合法用户会被搞砸。 ]

4 个答案:

答案 0 :(得分:5)

我认为这个问题是你可能会在系统周围放置大量的睡眠线程。如果您检测到滥用行为,请立即发回错误并完成。

我对您的方法的担心是重复滥用者,他们的超时时间长达数小时。即使他们没有使用CPU,你的线程也会长时间存在。除了CPU之外,还有其他资源要记住。

答案 1 :(得分:5)

Sleep()是一种在特定时间内“阻止”执行的功能。它不等于:

while (x<1000000);

因为这会导致100%的CPU使用率。它只是将进程置于操作系统中的“阻塞”状态,然后在计时器启动后将进程重新置于“就绪”状态。

但请记住,PHP的默认值为30秒超时。我不确定“Sleep()”是否符合这一点(我会怀疑它,因为它是系统调用而不是脚本)

你的主人可能不喜欢你有这么多“被阻止”的过程,所以要小心。

编辑:根据Does sleep time count for execution time limit?,似乎“Sleep()”不受“最大执行时间”(在Linux下)的影响,正如我预期的那样。显然它在Windows下。

答案 2 :(得分:5)

睡眠不使用接受呼叫的进程尚未使用的任何CPU或内存。

实施sleep()所面临的问题是,当攻击者网站周围等待你的睡眠超时时,你最终会用完文件描述符,然后你的网站将会出现在任何其他人身上。试图连接。

这是一个典型的DDoS场景 - 攻击者实际上并没有试图闯入您的计算机(他们也可能尝试这样做,但这是一个不同的故事)而是他们试图通过耗尽每一个来损害您的网站您拥有的资源,可以是带宽,文件描述符,处理线程等等 - 当您的某个资源用完时,虽然您的服务器实际上已关闭,但您的网站似乎已关闭。

这里唯一真正的防御是要么不接受呼叫,要么使用动态防火墙配置来过滤掉呼叫 - 或者是路由器/防火墙盒,它会执行相同的操作而不是服务器。

答案 3 :(得分:1)

如果你正在做我也尝试过的事情,我想你会明白的。

我的身份验证脚本构建了类似于Atwood的hellbanning理念。 SessionID在RAM中捕获并在每次页面调用时轮换。如果条件没有达到,我会以缺点标记该特定会话。三点之后,我开始为他们的执行添加sleep()调用。限制是可变的,但我确定3秒作为一个快乐的数字。

通过身份验证,攻击者依赖于每秒执行一定数量的尝试来使其值得攻击。如果这是他们的焦点,那么引入睡眠会使系统看起来比实际上慢,这在我看来会让它不太可能受到攻击。

如果你放慢速度而不是平缓地告诉他们没有,那么你就会有更合理的机会看起来不那么有吸引力了。

话虽如此,通过混淆的“类型”来保证安全性,所以你不能真正依赖它太过分了。它只是我整个食谱的另一个因素:)