php一分钟内限制ip访问次数参考代码
PHP -
@Aplum -
2021年05月31日
$ip = getip();
$ip = str_replace('.', '_', $ip);
$blackTxt = __DIR__ . '/black.txt';
if (!file_exists($blackTxt)) {
file_put_contents($blackTxt, '');
}
$blackIps = file_get_contents($blackTxt);
if ($ip && $blackIps && strpos($blackIps, $ip) !== false) {
@header("http/1.1 404 not found");
@header("status: 404 not found");
include("./404.html");
die;
}
$ipDir = __DIR__ . '/ips';
if (!is_dir($ipDir)) {
mkdir($ipDir);
}
$ipFile = $ip . '.txt';
if (!file_exists($ipDir . '/' . $ipFile)) {
file_put_contents($ipDir . '/' . $ipFile, json_encode(['start_time'=>time(), 'num'=>1, 'end_time'=>time()]));
}
$ipCheck = file_get_contents($ipDir . '/' . $ipFile);
if ($ipCheck) {
$ipCheck = json_decode($ipCheck, 1);
if ($ipCheck['num'] >= 3) {
if ($ipCheck['end_time'] - $ipCheck['start_time'] < 60) {
//1分钟内超过3次,写入黑名单
file_put_contents($blackTxt, $ip);
//清空文件
unlink($ipDir . '/' . $ipFile);
} else {
//重置
file_put_contents($ipDir . '/' . $ipFile, json_encode(['start_time'=>time(), 'num'=>1, 'end_time'=>time()]));
}
} else {
$ipCheck['num'] += 1;
$ipCheck['end_time'] = time();
file_put_contents($ipDir . '/' . $ipFile, json_encode($ipCheck));
}
}