可能重复:
防止 PHP 脚本被淹没
我的某些“朋友”按住刷新键一直在我的网站上乱搞。这使得他们的内容的页面浏览量不切实际地增加,并且它还增加了服务器负载到 PHP 停止运行的点。
我希望是否有一种方法可以防止使用 PHP 或 JavaScript 进行如此强烈的刷新(其中一个在 1 1/2 小时内收到 3 万个请求)?
可能重复:
防止 PHP 脚本被淹没
我的某些“朋友”按住刷新键一直在我的网站上乱搞。这使得他们的内容的页面浏览量不切实际地增加,并且它还增加了服务器负载到 PHP 停止运行的点。
我希望是否有一种方法可以防止使用 PHP 或 JavaScript 进行如此强烈的刷新(其中一个在 1 1/2 小时内收到 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
}
}
您将该代码放在网站的每个页面上,它将确保用户没有违反您预定的安全规则。
为此,请使用类似fail2ban的工具。
您可以创建一个规则来阻止请求者的 IP 地址,例如,当他们在给定时间内对同一 URL 发出过多请求时。并且您可以配置它们被阻止的时间跨度。
优点是这种阻塞方式已经发生在网络级别,从而降低了服务器负载。
阅读 apache/nginx 手册以限制来自单个 ip 的连接尝试等。
部分内容如下:
https://serverfault.com/questions/325317/nginx-prevent-dos-by-limiting-worker-processes-connections