什么是阻止机器人,恶意用户等执行PHP脚本太快的最佳方法?如果我使用usleep()
或sleep()
函数暂时只做"没有"(在所需的代码执行之前),或者是那种简单的愚蠢并且有更好的方法可以吗?
例:
function login() { //enter login code here } function logout() { //enter logout code here }
如果我只是说,usleep(3000000)
在登录和注销代码之前,那是没关系,还是更好,更明智的方式来实现我想要实现的目标?
编辑:根据下面的建议,那么usleep
或者sleep
只是使处理器脱离当前用户正在执行的当前脚本,还是导致它脱离整个服务?即如果一个用户+脚本调用sleep
/ usleep
,所有并发用户+脚本也会被延迟吗?
大多数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(更快)