1

我想知道如何在全球范围内限制每秒访问次数 - 对于所有 IP,而不是每个 IP - 以防止僵尸网络或类似网络破解密码。这将有效地将密码破解攻击转变为 DDOS 攻击。

请注意,此脚本的预期流量非常低(每天 1 次访问)。

例如

//pseudocode...
while (now() - last_access < 1 second)
    sleep(0.3 seconds)

last_access = now()

两个问题

  1. 这是一个好主意吗?
  2. 如何在 PHP 中做到这一点?(因为我无法控制 apache 配置)

编辑: 如果 n 用户试图一次访问该站点,我很高兴每个用户等待 n 秒。他们只需要每人加载一页。

4

4 回答 4

2

嗯,首先,你需要弄清楚你的门槛。什么算作更高的负载,什么算作 DDOS 攻击?

其次,您需要将 last_access 变量保存在更永久的位置,例如数据库。

但是,是的,您正在寻找的东西是可能的,如果您的网站经常受到攻击,建议您使用。

而不是 sleep (这在攻击的情况下是无用的),只需显示一个通用的

<h1>The server is currently experiencing extreme load. Please try again later</h1>

您的阈值应该更像是最后几秒钟内的 5 个用户(在这种情况下,您需要记录过去几秒钟内的所有访问,并自己计算。


更好的方法是强制用户注册,并在注册时使用验证码。

于 2012-07-04T16:12:27.987 回答
2

如果您绝对确定该站点每天仅合法访问一次,您当然可以这样做。

您可以使用 PHP 写入一个 txt 文件并将最后一次访问存储在那里 - 也就是说,如果您无权访问数据库或其他一些存储该信息的方式。

正如您自己提到的,这可能会导致您的站点永久关闭,因为即使是非常小的攻击(每秒 3-4 次点击几乎不能称为 DOS 攻击)也足以将您锁定在外。

于 2012-07-04T16:15:13.960 回答
1

有更好的方法来防止机器人。首先,强迫用户不能快速使用您的网站并不是一个好主意。相反,使用相同的方法,您可以测试以查看 IP 尝试登录以来的时间。例如,如果它不到 1 秒,甚至不处理输入,只输出“慢下来!”。更好的方法是使用类似于 captha 的方法,例如简单的数学问题。

于 2012-07-04T16:12:51.137 回答
1

想想看。

这基本上是一个“How-to-DDoS-Myself”的解释。

如果您设置了限制并从那时起阻止访问,那么您只是在使您自己的站点崩溃——这无论如何都是 DDoS 攻击的最终目标。此外,设置这样的人为限制会比任何 DDoS 更快地使您的网站崩溃(因为脚本需要在达到真正的“硬限制”之前激活)。

DDoS 缓解解决了一个问题:“如何在 DDoS 攻击期间保持正常运行?” 关闭自己不是答案。

这就像用氰化物治疗头痛一样——它会“从技术上”奏效,但我不会称它为治愈方法。

于 2012-07-05T10:23:39.563 回答