🗣 Wd提问: PHP源码短信轰炸防护
🤖 Ai回答: 在 PHP 项目中实现短信轰炸防护,主要目标是防止恶意用户通过频繁发送短信验证码来消耗短信服务商的资源或进行攻击。以下是几种有效的防护策略和代码实现示例:
✅ 一、防护策略概述
1、IP 频率限制
同一 IP 地址在单位时间内只能请求一定次数。
2、手机号频率限制
同一手机号在单位时间内只能请求一定次数。
3、验证码有效期控制
发送验证码后设置有效时间(如5分钟),期间不允许重复发送。
4、图形验证码前置校验
在发送短信前要求用户输入图形验证码,防止自动化脚本。
5、登录/注册行为结合风控
对于异常行为(如短时间内多次失败)进行拦截或人工审核。
6、使用 Redis 缓存计数器
实现高性能、分布式环境下的频率控制。
✅ 二、PHP + Redis 实现示例
前提:安装 Redis 扩展
bash
pecl install redis
或者使用 composer
composer require predis/predis
示例代码:`send_sms.php`
php
<?php
require_once 'vendor/autoload.php'; // 如果使用 Predis
use Predis\Client;
// 初始化 Redis 客户端
$redis = new Client('tcp://127.0.0.1:6379');
function sendSms($phone, $ip) {
global $redis;
// 1、检查图形验证码(伪代码)
if (!checkCaptcha($_POST['captcha'])) {
return ['status' = 'error', 'msg' = '图形验证码错误'];
}
// 2、设置频率限制键名
$ip_key = sms:limit:ip:$ip;
$phone_key = sms:limit:phone:$phone;
$phone_timer_key = sms:timer:phone:$phone;
// 3、获取当前时间戳
$now = time();
// 4、IP 频率限制:每分钟最多 5 次
$ip_count = $redis-get($ip_key);
if ($ip_count && $ip_count = 5) {
$expire_time = $redis-ttl($ip_key);
if ($expire_time 0) {
return ['status' = 'error', 'msg' = 请等待 {$expire_time} 秒后再试];
}
}
// 5、手机号频率限制:每分钟最多 1 次
$phone_count = $redis-get($phone_key);
if ($phone_count && $phone_count = 1) {
$expire_time = $redis-ttl($phone_key);
if ($expire_time 0) {
return ['status' = 'error', 'msg' = 该手机号已发送,请等待 {$expire_time} 秒后再试];
}
}
// 6、检查是否在有效期内(如5分钟内不能重复发送)
$last_sent = $redis-get($phone_timer_key);
if ($last_sent && $now $last_sent < 300) { // 300秒 = 5分钟
return ['status' = 'error', 'msg' = '验证码未过期,不能重复发送'];
}
// 7、记录本次发送
$redis-incr($ip_key);
$redis-incr($phone_key);
$redis-set($phone_timer_key, $now);
// 8、设置过期时间(例如 60 秒)
$redis-expire($ip_key, 60); // IP 限制 60 秒
$redis-expire($phone_key, 60); // 手机号限制 60 秒
$redis-expire($phone_timer_key, 300); // 5分钟内不能再发
// 9、调用短信服务发送验证码(伪代码)
$code = rand(100000, 999999);
$redis-set(sms:code:$phone, $code, 'EX', 300); // 存储验证码,5分钟过期
// 真实调用短信接口
// sendSmsToProvider($phone, $code);
return ['status' = 'success', 'msg' = '验证码已发送'];
}
// 处理请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$phone = trim($_POST['phone']);
$ip = $_SERVER['REMOTE_ADDR'];
if (empty($phone)) {
echo json_encode(['status' = 'error', 'msg' = '请输入手机号']);
exit;
}
$result = sendSms($phone, $ip);
echo json_encode($result);
}
✅ 三、增强建议
1、图形验证码集成
推荐使用 `Google reCAPTCHA` 或自建简单验证码系统。
2、异常行为检测
记录失败尝试次数,超过阈值锁定账户或IP。
3、分布式锁(可选)
如果应用部署在多台服务器,确保 Redis 是共享的,避免绕过限制。
4、日志记录
记录每次请求日志,便于审计和追踪攻击源。
php
// 示例:记录日志
file_put_contents('sms_log.txt', date('Y-m-d H:i:s') 、 IP:{$ip}, Phone:{$phone}, Result:{$result['msg']}\n, FILE_APPEND);
✅ 四、注意事项
❗ 不要仅依赖前端验证,所有频率控制必须在后端实现。
❗ 避免暴露敏感信息(如“该手机号已发送”),应统一返回模糊提示。
❗ 使用 HTTPS,防止中间人攻击截获验证码。
❗ 定期清理 Redis 过期数据(Redis 自动处理,无需手动)。
✅ 五、总结
| 防护措施 | 说明 |
| IP 频率限制 | 同一IP每分钟最多5次 |
| 手机号频率限制 | 同一手机号每分钟最多1次 |
| 有效期控制 | 5分钟内不能重复发送 |
| 图形验证码 | 防止自动化脚本 |
| Redis 缓存 | 支持高并发、分布式部署 |
💡 最佳实践:结合多种策略,从“前端 → 后端 → 服务端”层层防御。
✅ 如需进一步优化,可以引入 AI风控系统 或 第三方安全服务(如阿里云盾、腾讯云安全)。
如有具体业务场景(如注册、登录、找回密码),可定制更精细的规则。欢迎提供需求细节,我可为你定制完整方案。
📣 商家广告:





0
IP地址: 163.183.174.64
搜索次数: 0
提问时间: 2025-11-11 04:13:41
🛒 域名购买:
37.gold
q-u.com.cn
kc.biz
352.net.cn
wosou.com.cn
pai.pw
92.gs
46.gold
3331.top
ftp.ink
❓️ 热门提问:
租用云的服务器价格
show域名
ip归属单位查询
好用的美国主机
香港的商业登记证
升腾服务器租赁
gpu-z中文下载
站群程序开发服务公司行业调研顾问
rust开服务器
可注册域名查询
豌豆Ai站群搜索引擎系统
🌐 域名评估:
koupin.com.cn
vtol.hk.cn
y-w.com.cn
m.tj.cn
xhxai.org.cn
nslr.cn
yd.sn.cn
61.gold
n.tj.cn
ecek.cn
⛏ 最新挖掘:
凯里酸汤鱼
贵阳烤脑花
都匀毛尖茶
花溪牛肉粉
贵阳烤生蚝
贵阳烤豆腐
贵阳纸包鱼
贵阳特色菜
🖌 热门作画:
🤝 关于我们:
豌豆Ai
域名
建站
站群
留痕
推广
评估
源码
开发Ai
工具
日记
价格
加盟
广告
流量
留言
联系
🗨 加入群聊:
🔗 友情链接:
検索エンジン ai
google优化
ai提问
🧰 站长工具:
Ai工具 whois查询 搜索
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.10.25》搭建本站。