php实现防洪
PHP 实现防洪(防刷)措施
防洪(防刷)通常指防止恶意用户通过高频请求或自动化脚本对系统进行攻击或滥用。以下是几种常见的 PHP 实现方法:
IP 限流
通过记录用户 IP 的访问频率,限制单个 IP 在单位时间内的请求次数。可以使用 Redis 或文件缓存存储访问计数。
$ip = $_SERVER['REMOTE_ADDR'];
$key = 'rate_limit:' . $ip;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$current = $redis->get($key);
if ($current && $current >= 10) {
header('HTTP/1.1 429 Too Many Requests');
exit('请求过于频繁,请稍后再试');
}
$redis->incr($key);
$redis->expire($key, 60); // 限制 1 分钟内最多 10 次请求
验证码
在敏感操作(如登录、注册)前加入验证码验证,防止自动化脚本滥用。

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($_POST['captcha'] !== $_SESSION['captcha']) {
die('验证码错误');
}
// 继续处理逻辑
}
// 生成验证码
$captcha = rand(1000, 9999);
$_SESSION['captcha'] = $captcha;
Token 防重放
为表单生成一次性 Token,防止重复提交或 CSRF 攻击。
session_start();
if (!isset($_SESSION['form_token'])) {
$_SESSION['form_token'] = bin2hex(random_bytes(32));
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if ($_POST['token'] !== $_SESSION['form_token']) {
die('无效请求');
}
unset($_SESSION['form_token']);
// 继续处理逻辑
}
请求频率限制
通过记录用户行为(如登录失败次数)限制操作频率。

$key = 'login_attempts:' . $_SERVER['REMOTE_ADDR'];
$attempts = $redis->get($key) ?: 0;
if ($attempts >= 5) {
die('登录尝试过多,请稍后再试');
}
if (!check_password($_POST['password'])) {
$redis->incr($key);
$redis->expire($key, 3600); // 1 小时内限制 5 次尝试
die('密码错误');
}
$redis->del($key); // 登录成功清除记录
浏览器指纹
结合 User-Agent、IP 和其他客户端信息生成唯一标识,用于识别恶意行为。
$fingerprint = md5(
$_SERVER['REMOTE_ADDR'] .
$_SERVER['HTTP_USER_AGENT'] .
$_SERVER['HTTP_ACCEPT_LANGUAGE']
);
延迟响应
对可疑请求人为增加延迟,降低自动化脚本效率。
if (is_suspicious_request()) {
usleep(500000); // 延迟 0.5 秒
}
注意事项
- 多层级防御:结合多种措施提高安全性。
- 日志记录:记录异常请求便于分析和追溯。
- 用户体验:合理设置阈值避免误伤正常用户。
- 分布式环境:使用 Redis 等集中存储实现跨服务器限流。






