2009-02-01 156 views
7

阻止漫游器,恶意用户等执行php脚本的速度太快的最佳方法是什么?如果我使用usleep()sleep()函数在短时间内执行“无”(恰好在所需的代码执行之前),或者是简单的愚蠢并且有更好的方法吗?推迟执行PHP脚本

例子:

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

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

如果我只是把,比如说,usleep(3000000)登录和注销码之前,是好的,还是有更好的,我达到想达到什么样的聪明的方式?

编辑:基于下面的建议,并然后usleepsleep仅使所述处理器从当前脚本脱离由当前用户执行,或者它导致它从整个服务脱离?即,如果一个用户+脚本调用sleep/usleep,所有并发用户+脚本是否也会被延迟?

回答

8

的方式大多数Web服务器的工作(如Apache)是保持工作线程的集合。当执行一个PHP脚本,一个线程运行PHP脚本。

当你的脚本执行sleep(100),剧本需要100秒,执行..这意味着你的工作线程绑为100秒。

的问题是,你有工人线程非常有限数量的 - 说你有10个线程和10人登录 - 现在你的Web服务器不能提供任何进一步答复..

以最好的方式限速登录(或其他操作)是用某种快速内存存储的东西(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是基本相同,但该数据库被替换为分布式缓存(这是更快)

1

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

大多数LAMP服务器(以及大多数路由器/交换机,其实)已经配置以防止拒绝服务攻击。他们通过拒绝来自同一IP地址的多个连续请求来做到这一点。

1

你不想睡在你的PHP。这样做会大大减少您的服务器可以处理的并发请求的数量,因为您将有连接等待。

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

如果因为某些原因你不能指望REMOTE_ADDR是用户特定的(每个人都在同一个防火墙之后等),你可以在登录表单中证明一个挑战,并让远程浏览器对它进行扩展计算(比如说,一个数字的因子),你可以快速检查服务器端(快速乘法)。

2

阻止机器人,恶意用户等 执行php脚本太快?

我会先问你真的想阻止什么?如果它是拒绝服务攻击,那么我不得不说,如果受限于可以添加到PHP脚本中的内容,您就无能为力。现有技术的水平远远超出了我们程序员所能防范的范围。开始寻找专为此目的而设计的系统管理员工具。

还是你想限制你的服务,让真正的人可以访问它,但机器人不能?如果是这样,我会看看一些“验证码”技术。

或者你是否试图阻止用户每秒钟轮询你的网站寻找新的内容?如果是这样,我会调查提供一个RSS提要或其他方式通知他们,所以他们不会吃掉你的带宽。

还是别的东西?一般来说,我会说sleep()和usleep()都不是好方法。

-
BMB