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

Php 我应该使用Sleep()还是拒绝它们,php,sleep,rate-limiting,Php,Sleep,Rate Limiting,我正在实施一个延迟系统,这样任何我认为滥用的IP都会通过Sleep()自动获得增量延迟 我的问题是,如果攻击者只是在延迟的情况下不断打开新实例,这会导致CPU使用量增加,从而杀死我的站点吗?或者sleep()命令使用最少的CPU/内存,不会对小脚本造成很大负担。我不想直截了当地否认他们,因为我宁愿他们不以明显的方式知道限制,但愿意听到我为什么应该这样做 [请不要讨论为什么我在一个小网站上认为IP滥用,原因如下:我最近创建了一个脚本,cURL是一个页面并将信息返回给用户,我注意到一些IP对我愚蠢的

我正在实施一个延迟系统,这样任何我认为滥用的IP都会通过Sleep()自动获得增量延迟

我的问题是,如果攻击者只是在延迟的情况下不断打开新实例,这会导致CPU使用量增加,从而杀死我的站点吗?或者sleep()命令使用最少的CPU/内存,不会对小脚本造成很大负担。我不想直截了当地否认他们,因为我宁愿他们不以明显的方式知道限制,但愿意听到我为什么应该这样做


[请不要讨论为什么我在一个小网站上认为IP滥用,原因如下:我最近创建了一个脚本,cURL是一个页面并将信息返回给用户,我注意到一些IP对我愚蠢的小脚本进行了垃圾邮件处理。经常使用cURL有时会使我的结果无法从im轮询的服务器上获得,合法用户会被欺骗我认为问题在于,系统中可能存在大量休眠线程。如果检测到滥用,请立即发回错误并处理

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

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

while (x<1000000);

while(x睡眠不会使用接受调用的进程尚未使用的任何CPU或内存

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

这是一个典型的DDoS场景——攻击者实际上并没有试图侵入您的计算机(他们也可能尝试这样做,但这是另一个故事)相反,他们正试图通过用尽你所有的资源(带宽、文件描述符、处理线程等)来损害你的网站。当你的一个资源用尽时,你的网站似乎关闭了,尽管你的服务器实际上没有关闭


这里唯一真正的防御措施是要么不接受呼叫,要么采用过滤呼叫的动态防火墙配置——或者采用路由器/防火墙箱,但不使用服务器。如果你正在做我也尝试过的事情,我想你会明白的

我的身份验证脚本构建了类似于Atwood的Hellbaning想法的东西。会话ID在RAM中捕获,并在每次页面调用中旋转。如果不满足条件,我会用记过标记该特定会话。三次之后,我开始添加sleep()对他们执行死刑的要求。限制是可变的,但我决定3秒作为一个快乐的数字

对于身份验证,攻击者依赖于每秒执行一定次数的尝试以使其值得攻击。如果这是他们的重点,则引入睡眠会使系统看起来比实际慢,我认为这会降低攻击的可取性

如果你让他们慢下来,而不是直截了当地告诉他们不,那么你看起来就不那么有吸引力了


也就是说,这是通过一种“类型”的模糊处理实现的安全性,所以你不能过分依赖它。这只是我整个配方中的另一个因素:)

如果可能的话,我会在更高的层面上禁止它们(=更少的资源使用)@Wrikken,这不是一个segfault问题,因为OP是在问如何对虐待用户进行代码防御。杰夫·阿特伍德(Jeff Atwood)没有写过关于这一点的文章吗?它被称为Hellbaning或Lagbaning或其他什么。如果他在没有bajilli的情况下做出决定,我很想知道他打算如何实施它当你特别不想讨论如何确定滥用用户时,听起来攻击相当“愚蠢”那么,您是否考虑过在robots.txt中添加一个条目来禁止基于代理id的爬行?在编写任何代码之前,您可能可以为低质量的滥用行为做很多事情。@Soren:我不是这么说的(否则,我会投票赞成移动),我只是说我会这么做,特别是限制资源使用。我提供了一个替代方案,而不是一个答案,非常适合发表评论,你不觉得吗?