7

我实现了一个延迟系统,以便我认为滥用的任何 IP 都会通过 Sleep() 自动获得增量延迟。

我的问题是,如果攻击者只是在延迟的同时继续打开新实例,这是否会导致 CPU 使用率增加并因此杀死我的网站?或者 sleep() 命令是否使用最少的 CPU/内存,并且不会对小脚本造成太大负担。我不想完全否认他们,因为我宁愿他们不以明显的方式知道限制,但愿意听我为什么要这样做。

[请不要讨论为什么我认为在一个小网站上滥用 IP,原因如下:我最近构建了一个脚本,它是一个页面并将信息返回给用户,我注意到一些 IP 向我愚蠢的小脚本发送垃圾邮件。经常卷曲有时会使我的结果无法从服务器即时轮询中获得,并且合法用户会被他们的结果搞砸。]

4

4 回答 4

5

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

我对你的方法的担心是重复滥用者,他们的超时时间长达几个小时。即使他们不使用 CPU,您也会让他们的线程停留很长时间。除了 CPU 之外,还有其他资源需要牢记。

于 2011-07-26T23:26:58.560 回答
5

Sleep() 是一个在特定时间内“阻止”执行的函数。它不等同于:

while (x<1000000);

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

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

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

编辑:根据睡眠时间是否计入执行时间限制?,正如我所料,“睡眠()”似乎不受“最大执行时间”(在Linux下)的影响。显然它在Windows下。

于 2011-07-26T23:27:42.447 回答
5

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

实现 sleep() 时您将面临的问题是,您最终将用完文件描述符,而攻击者站点正在等待您的睡眠超时,然后您的站点似乎对任何其他尝试连接的人都无法访问.

这是典型的 DDoS 场景——攻击者实际上并没有尝试闯入您的机器(他们也可能尝试这样做,但这是另一回事),而是试图通过耗尽您拥有的所有资源来破坏您的站点,或者是带宽、文件描述符、处理线程等——当你的一个资源用完时,你的站点似乎已经关闭,尽管你的服务器实际上并没有关闭。

这里唯一真正的防御是要么不接受呼叫,要么有一个动态防火墙配置过滤掉呼叫——或者一个路由器/防火墙盒,它做同样的事情但不在你的服务器上。

于 2011-07-26T23:29:58.500 回答
1

如果你正在做我也尝试过的事情,我认为你会很清楚。

我的身份验证脚本构建了类似于 Atwood 的地狱禁令的想法。SessionID 被捕获在 RAM 中,并在每次页面调用时轮换。如果不满足条件,我会以记过的方式标记该特定会话。三点之后,我开始在他们的执行中添加 sleep() 调用。限制是可变的,但我选择了 3 秒作为一个快乐的数字。

通过身份验证,攻击者依靠每秒执行一定次数的尝试来使攻击变得值得。如果这是他们的重点,那么引入睡眠会使系统看起来比实际慢,在我看来,这会降低攻击的可取性。

如果你放慢他们的速度,而不是直截了当地告诉他们不,那么你看起来不那么有吸引力的可能性会稍微大一些。

That being said, it is security through a "type" of obfuscation, so you can't really rely on it too terribly much. Its just another factor in my overall recipe :)

于 2011-07-26T23:57:59.843 回答