延迟PHP脚本的执行

时间:2009-02-01 05:17:14

标签: php delayed-execution

阻止僵尸程序,恶意用户等以太快的方式执行php脚本的最佳方法是什么?如果我使用usleep()sleep()函数暂时只做“没有”(就在所需的代码执行之前),或者是那种简单的愚蠢并且有更好的方法吗?

示例:

function login() {
 //enter login code here
}

function logout() {
 //enter logout code here
}

如果我只是在登录和退出代码之前说usleep(3000000),那还不错,或者是否有更好的,更明智的方法来实现我想要实现的目标?

编辑:根据以下建议,usleepsleep只会导致处理器脱离当前用户正在执行的当前脚本,或者它导致它脱离整个服务?即如果一个用户+脚本调用sleep / usleep,所有并发用户+脚本也会被延迟吗?

4 个答案:

答案 0 :(得分:8)

大多数Web服务器的工作方式(例如Apache)是维护一组工作线程。执行PHP脚本时,一个线程运行PHP脚本。

当你的脚本执行sleep(100)时,脚本需要100秒才能执行..这意味着你的工作线程被绑定了100秒。

问题是,你有一个非常有限的工作线程 - 比如你有10个线程,10个人登录 - 现在你的网络服务器无法提供任何进一步的响应..

限制登录(或其他操作)的最佳方法是使用某种快速的内存存储(memcached非常适合这种情况),但这需要运行单独的进程并且非常复杂(如果你像Facebook一样运行,你可能会这样做。)。

更简单,您可以拥有一个存储user_idip_addressfirst_failedfailure_counter的数据库表。

每次登录失败时,您(伪代码)都会执行以下操作:

if (first_failed in last hour) and (failure_counter > threshold):
    return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
    increment failure_counter
else:
    reset first_failed to current time
    increment failure_counter

也许不是最有效的,并且有更好的方法,但它应该停止暴力强迫。使用memcached基本相同,但数据库被替换为memcached(更快)

答案 1 :(得分:3)

  

停止机器人,恶意用户等   从执行PHP脚本太快?

我首先会问你到底想要阻止什么?如果是拒绝服务攻击,那么我不得不说,如果你受限于你可以添加到PHP脚本的内容,那么你无能为力。最先进的技术超出了程序员可以防范的程度。开始查看为此目的而设计的sysadmin工具。

或者您是否试图限制您的服务,以便真正的人可以访问它,但机器人不能?如果是这样,我会看一些“验证码”技术。

或者您是否试图阻止用户每秒查看您的网站寻找新内容?如果是这样,我会调查提供RSS提要或其他一些通知他们的方式,这样他们就不会占用你的带宽。

还是别的什么?

一般来说,我说睡眠()和睡眠()都不是好方法。

答案 2 :(得分:1)

您建议的方法会强制所有用户在登录前不必要地等待。

大多数LAMP服务器(实际上大多数路由器/交换机)已配置为防止拒绝服务攻击。他们通过拒绝来自同一IP地址的多个连续请求来实现此目的。

答案 3 :(得分:1)

你不想在你的PHP中睡觉。这样做将大大减少您的服务可以处理的并发请求数,因为您将保持打开等待的连接。

大多数HTTP服务器都具有可以启用以避免DoS攻击的功能,但是如果没有这样做,您应该只跟踪最近看过很多次的IP地址,并向他们发送403 Forbidden,并要求他们等待一秒钟。

如果由于某种原因你不能指望REMOTE_ADDR是特定于用户的(同一个防火墙后面的每个人等),你可以在登录表单中证明是一个挑战,并使远程浏览器对其进行扩展计算(例如,您可以在服务器端快速检查(快速乘法)。