7

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

例子:

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

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

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

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

4

4 回答 4

8

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

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

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

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

更简单的是,您可以拥有一个存储user_idip_addressfirst_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替换了数据库(这样更快)

于 2009-02-01T06:47:30.897 回答
3

阻止机器人、恶意用户等过快地执行 php 脚本?

我首先要问你真正想防止什么?如果是拒绝服务攻击,那么我不得不说,如果您受限于可以添加到 PHP 脚本中的内容,那么您将无能为力。最先进的技术远远超出了我们作为程序员可以保护的范围。开始查看为此目的设计的系统管理工具。

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

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

或者是别的什么?

一般来说,我会说 sleep() 和 usleep() 都不是一个好方法。

于 2009-02-01T06:27:00.940 回答
1

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

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

于 2009-02-01T05:42:39.063 回答
1

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

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

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

于 2009-02-01T05:52:15.783 回答