0

可能重复:
防止 PHP 脚本被淹没

我的某些“朋友”按住刷新键一直在我的网站上乱搞。这使得他们的内容的页面浏览量不切实际地增加,并且它还增加了服务器负载到 PHP 停止运行的点。

我希望是否有一种方法可以防止使用 PHP 或 JavaScript 进行如此强烈的刷新(其中一个在 1 1/2 小时内收到 3 万个请求)?

4

3 回答 3

3

您始终可以计算用户从某个 IP 地址发出的请求数,并在达到某个限制后停止返回除 Unauthorized 以外的任何内容。

这是一个非常简单的解决方案,但可能会完成这项工作。您可以通过请求/时间间隔将其切断,或者在两分钟内不超过 100 个页面请求或其他内容。然后,您可以禁止 IP,或在指定的时间内返回错误代码。该指定的时间量可能是硬编码的,例如 5 小时,或者您可以等待他们的请求/时间间隔自然下降。

function isIpBlocked($ip)
{
    //do mysql query to check if column is true
}

function shouldIpBeBlocked($ip)
{
    //do mysql query to check if number of request over a certain interval is too high
}

if(isIpBlocked($ip))
{
    header('HTTP/1.0 401 Unauthorized');
}
else
{
   if(shouldUserBeBlocked($ip))
   {
       //do sql update/insert to indicate user is blocked in ip_block table or something
       header('HTTP/1.0 401 Unauthorized');
   }
   else
   {
      //update number of requests from this ip address INSERT INTO ip_history (ip, ...) VALUE (:ip, ....);
      //do your web site code

      //maybe do a mysql query to clean out ip_history table for requests that happened a long time ago and check to see if you should unban people
   }
}

您将该代码放在网站的每个页面上,它将确保用户没有违反您预定的安全规则。

于 2012-10-22T19:25:37.230 回答
1

为此,请使用类似fail2ban的工具。

您可以创建一个规则来阻止请求者的 IP 地址,例如,当他们在给定时间内对同一 URL 发出过多请求时。并且您可以配置它们被阻止的时间跨度。

优点是这种阻塞方式已经发生在网络级别,从而降低了服务器负载。

于 2012-10-22T19:38:26.753 回答
1

阅读 apache/nginx 手册以限制来自单个 ip 的连接尝试等。

部分内容如下:

https://serverfault.com/questions/325317/nginx-prevent-dos-by-limiting-worker-processes-connections

如何使用 Apache 实现速率限制?(每秒请求数)

于 2012-10-22T19:38:58.020 回答