阻止机器人、恶意用户等的最佳方法是什么?php脚本执行速度太快?如果我使用可以吗 usleep() 或者 sleep() 函数只是暂时“什么都不做”(就在所需的代码执行之前),或者这很愚蠢,有更好的方法吗?

例子:

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

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

如果我只是说, usleep(3000000) 在登录和注销代码之前,可以吗?还是有更好、更明智的方法来实现我想要实现的目标?

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

有帮助吗?

解决方案

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

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

问题是,您的工作线程数量非常有限 - 假设您有 10 个线程,并且有 10 个人登录 - 现在您的网络服务器无法提供任何进一步的响应。

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

更简单,您可以有一个数据库表来存储 user_id 或者 ip_address, first_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(速度更快)

其他提示

  

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

我会先问你真正试图阻止?如果是拒绝服务攻击,那么我不得不说,有什么可以做,如果你是什么,你可以添加到PHP脚本的限制。该领域的现状是这么多超出了我们作为程序员可以抵御。开始寻找在为此而设计的系统管理员工具。

或者,你想限制你的服务,使真实的人可以访问它,但机器人却不能?如果是的话,我会看一些“验证码”技术。

或者,你想阻止投票网站的用户的每一秒寻找新的内容?如果是的话,我会研究提供一个RSS feed或通知他们,让他们不要吃你的带宽的一些其他的方式。

或者是别的什么?

在一般情况下,我会说既不睡眠()也不usleep()函式是一个很好的方法。

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

大多数LAMP服务器(和最路由器/交换机,实际上)已被配置为防止拒绝服务攻击。他们来自同一个IP地址否认多个连续的请求做到这一点。

您不想把睡在你的PHP。这样做会大大降低你的服务可以处理,因为你必须保持打开等待连接的并发请求数。

大多数HTTP服务器具有的功能,你可以启用,以避免DoS攻击,但做不到这一点,你应该只跟踪你见过太多次发过帖子的IP地址,并给他们一个消息紫禁城403,要求他们等一下。

如果你因为某些原因不能被REMOTE_ADDR用户特定的(每个人的同一个防火墙后面,等等),你可以证明的登录表单一个挑战,使远程浏览器做就可以扩展计算次数(比如,因素的数),可以快速地检查在服务器侧(与快速倍增)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top