阻止僵尸程序,恶意用户等以太快的方式执行php脚本的最佳方法是什么?如果我使用usleep()
或sleep()
函数暂时只做“没有”(就在所需的代码执行之前),或者是那种简单的愚蠢并且有更好的方法吗?
示例:
function login() {
//enter login code here
}
function logout() {
//enter logout code here
}
如果我只是在登录和退出代码之前说usleep(3000000)
,那还不错,或者是否有更好的,更明智的方法来实现我想要实现的目标?
编辑:根据以下建议,usleep
或sleep
只会导致处理器脱离当前用户正在执行的当前脚本,或者它导致它脱离整个服务?即如果一个用户+脚本调用sleep
/ usleep
,所有并发用户+脚本也会被延迟吗?
答案 0 :(得分:8)
大多数Web服务器的工作方式(例如Apache)是维护一组工作线程。执行PHP脚本时,一个线程运行PHP脚本。
当你的脚本执行sleep(100)
时,脚本需要100秒才能执行..这意味着你的工作线程被绑定了100秒。
问题是,你有一个非常有限的工作线程 - 比如你有10个线程,10个人登录 - 现在你的网络服务器无法提供任何进一步的响应..
限制登录(或其他操作)的最佳方法是使用某种快速的内存存储(memcached非常适合这种情况),但这需要运行单独的进程并且非常复杂(如果你像Facebook一样运行,你可能会这样做。)。
更简单,您可以拥有一个存储user_id
或ip_address
,first_failed
和failure_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是特定于用户的(同一个防火墙后面的每个人等),你可以在登录表单中证明是一个挑战,并使远程浏览器对其进行扩展计算(例如,您可以在服务器端快速检查(快速乘法)。