2011-07-26 63 views
6

即时通讯实施延迟系统,以便我认为滥用任何IP将通过睡眠()自动获得增量延迟。我应该使用睡眠()还是仅仅拒绝他们

我的问题是,这会导致增加CPU的使用,从而反正杀了我的网站,如果攻击者只是不断在被推迟打开新的实例?或者,sleep()命令使用最小的CPU /内存,并且不会成为小脚本的负担。我不想拒绝他们,因为我宁愿他们不知道明显的限制,但愿意听到我为什么应该这样做。

[请了为什么IM推定的IP滥用的一个小网站,导致继承人为什么没有讨论:我最近建立了一个卷曲是一个&页面返回信息给用户一个剧本,我注意到了一些IP的垃圾邮件我愚蠢的小脚本。卷曲太频繁有时会导致我的结果无法从服务器进行轮询,并且合法用户被搞砸了。 ]

+0

我会去禁止他们在更高的水平,如果可能的话(=更少的资源使用),[这个问题在serverfault](http://serverfault.com/questions/ 287851/prevent-hammering-script-parsers)似乎很适合。 – Wrikken

+0

@Wrikken,这不是一个段错误问题,因为OP在询问如何防御恶意用户。 – Soren

+1

杰夫·阿特伍德没有写过关于这方面的东西吗?它被称为hellbanning或lagbanning什么的。我有兴趣了解他是如何计划实施它的,如果他确实没有让百万睡眠线程搞乱系统的话。 –

回答

5

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

执行sleep()会面临的问题是,当攻击者站点等待您的睡眠时间超时时,您最终将耗尽文件描述符,然后您的站点将显示为任何其他人谁试图连接。

这是一个典型的DDoS场景 - 攻击者实际上并没有试图闯入你的机器(他们也可能试图做到这一点,但这是一个不同的存储),而不是他们试图通过使用您拥有的每种资源,包括带宽,文件描述符,处理线程等 - 当您的某个资源用完时,您的网站似乎已关闭,尽管您的服务器实际上并非

这里唯一的真正的防御是要么不接受电话,或者有一个动态防火墙配置过滤掉电话 - 或者路由器/防火墙设备,其不相同,但关闭服务器。

5

我觉得这个问题是,你可能有睡眠线程的系统周围铺设的大量。如果你发现你的滥用,立即发回一个错误,并与它做。

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

5

Sleep()是一个“阻止”执行一段时间的函数。这不等于:

while (x<1000000); 

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

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

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

编辑:根据Does sleep time count for execution time limit?,看起来“睡眠()”不受“最大执行时间”(在Linux下)的影响,正如我所料。显然它在Windows下。

1

如果你正在做我也试过的东西,我想你会清楚。

我的验证脚本构建了类似于阿特伍德的屁股想法。会话ID被捕获在RAM中,并在每次页面调用时都旋转。如果条件没有得到满足,我会以记过的方式标记该特定会议。三点之后,我开始将sleep()调用添加到它们的执行中。这个限制是可变的,但我以3秒的速度定位为一个快乐的数字。

通过身份验证,攻击者依靠每秒执行一定次数的尝试使其值得他们值得攻击。如果这是他们的焦点,那么引入睡眠会让系统看起来比实际情况要慢,这在我看来会让它不太适合进行攻击。

如果你让他们放慢脚步,而不是单纯地告诉他们不行,那么你会有一个看起来不太吸引人的机会。

这就是说,这是通过一种“混淆类型”来实现的安全性,所以你不能真正依赖它太多太多。它只是在我的整体食谱中的另一个因素:)

相关问题