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

las*_*ior 7 php sleep rate-limiting

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

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

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

col*_*ium 5

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

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


Chr*_*ris 5

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

while (x<1000000);
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:根据睡眠时间计算执行时间限制?,正如我所预料的那样,"Sleep()"似乎不受"最大执行时间"(在Linux下)的影响.显然它在Windows下.


Sor*_*ren 5

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

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

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

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