如何用PHP实现短信发送限制?短信接口限流方法详解

在PHP中限制短信发送频率是防止滥用的重要措施,以下是几种常见的实现方案和代码示例:

php限制短信

核心思路

  1. 频率限制:基于手机号/IP限制单位时间内的发送次数
  2. 验证码校验:增加图形验证码或滑块验证
  3. 冷却时间:发送后强制等待时间

方案1:基于Redis的计数器(推荐)

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$mobile = $_POST['mobile'];
$ip = $_SERVER['REMOTE_ADDR'];
// 设置频率限制(1分钟内同一手机最多1条)
$mobileKey = "sms_limit:{$mobile}";
if ($redis->exists($mobileKey)) {
    die("操作过于频繁,请1分钟后再试");
}
// IP限制(1小时内最多发10条)
$ipKey = "sms_ip_limit:{$ip}";
$ipCount = $redis->incr($ipKey);
if ($ipCount > 10) {
    die("今日发送次数已达上限");
}
$redis->expire($ipKey, 3600); // 1小时过期
// 发送短信(模拟)
if (sendSMS($mobile)) {
    // 设置手机号冷却时间(60秒)
    $redis->setex($mobileKey, 60, "1");
    echo "短信发送成功";
}
function sendSMS($mobile) {
    // 实际对接短信接口
    return true;
}
?>

方案2:数据库记录法(MySQL)

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$mobile = $_POST['mobile'];
$ip = $_SERVER['REMOTE_ADDR'];
// 检查1分钟内是否已发送
$stmt = $pdo->prepare("SELECT COUNT(*) FROM sms_log 
                      WHERE mobile = ? AND created_at > NOW() - INTERVAL 1 MINUTE");
$stmt->execute([$mobile]);
if ($stmt->fetchColumn() > 0) {
    die("请等待60秒后重试");
}
// 检查IP当日发送量
$stmt = $pdo->prepare("SELECT COUNT(*) FROM sms_log 
                      WHERE ip = ? AND created_at > CURDATE()");
$stmt->execute([$ip]);
if ($stmt->fetchColumn() >= 50) {
    die("今日发送次数已达上限");
}
// 记录发送日志
$stmt = $pdo->prepare("INSERT INTO sms_log (mobile, ip, created_at) VALUES (?, ?, NOW())");
$stmt->execute([$mobile, $ip]);
// 发送短信...
echo "短信发送成功";
?>

表结构:

php限制短信

CREATE TABLE sms_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    mobile VARCHAR(20) NOT NULL,
    ip VARCHAR(45) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

方案3:前端+后端双重验证

// 后端增加图形验证码验证
session_start();
if ($_POST['captcha'] !== $_SESSION['captcha']) {
    die("验证码错误");
}
// 销毁已用验证码
unset($_SESSION['captcha']);
// 后续发送逻辑...

关键防护措施

防护层 实现方式 推荐值
手机号冷却期 Redis SETEX 60-120秒
单日手机号上限 Redis INCR/Database COUNT 5-10次/日
IP频率限制 Redis INCR/Database COUNT 50次/小时
验证码防护 GD库生成图形验证码 必选

最佳实践建议

  1. 多级限制:手机号+IP双重校验
  2. 错误模糊:不返回具体限制类型(如”操作频繁”替代”手机号超限”)
  3. 日志监控:记录异常请求用于分析攻击
  4. 动态调整:根据业务情况自动调整阈值
    // 动态调整示例:繁忙时段放宽限制
    $hour = date('H');
    $maxLimit = ($hour >= 8 && $hour <= 20) ? 15 : 5;

重要提示:生产环境应结合WAF防火墙、Nginx限流模块等基础设施级防护,避免所有压力集中在应用代码层。

php限制短信

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/289752.html

赞 (0)
上一篇 2026年2月9日 21:14
下一篇 2026年2月9日 21:17

相关推荐

  • 如何部署PHP项目到服务器? | PHP项目上线详细教程

    将 PHP 项目发布到服务器的完整流程如下,包含详细步骤和注意事项:准备工作项目本地测试确保项目在本地开发环境(如 XAMPP/WAMP)正常运行处理所有错误和警告(error_reporting = E_ALL)移除调试代码和测试文件服务器环境检查# 连接服务器(示例)ssh username@server……

    2026年2月13日
    03190
  • 为什么b5每次进服务器总会白屏?b5进服务器白屏怎么解决?

    B5每次进服务器白屏,核心原因往往是DirectX组件损坏、显卡驱动版本过旧或游戏文件完整性缺失,通过修复系统运行库、更新驱动及验证游戏缓存能解决绝大多数情况,很多CS2/CSGO玩家从其他平台转战B5对战时,都遇到过点击“进入服务器”后屏幕一片惨白,鼠标转圈然后闪退的尴尬,别急着重装游戏,白屏不等于系统崩溃……

    2026年8月16日
    01595
    • 服务器间歇性无响应是什么原因?如何排查解决?

      根源分析、排查逻辑与解决方案服务器间歇性无响应是IT运维中常见的复杂问题,指服务器在特定场景下(如高并发时段、特定操作触发时)出现短暂无响应、延迟或服务中断,而非持续性的宕机,这类问题对业务连续性、用户体验和系统稳定性构成直接威胁,需结合多维度因素深入排查与解决,常见原因分析:从硬件到软件的多维溯源服务器间歇性……

      2026年1月10日
      020
  • 宽带密码和用户名忘了怎么办?宽带账号密码找回技巧

    宽带密码与用户名遗忘并非无法解决的死结,绝大多数情况下可通过运营商官方渠道、路由器管理后台或云服务商提供的自助工具快速找回,对于企业用户,建议将账号凭证纳入数字化资产管理体系,利用云产品实现自动化备份与权限隔离,从根源上杜绝此类风险,当宽带账号密码遗忘时,盲目尝试或频繁重置往往会导致账户被临时锁定,增加业务中断……

    2026年4月26日
    07083
  • 我的世界纯净服务器可以装什么MOD,生存模式必备模组推荐有哪些?

    我的世界纯净服务器可以安装服务端专用的优化类和玩法类模组,但必须选择为原版协议设计的轻量模组,而非依赖 Forge/Fabric 客户端的大型内容模组,很多玩家以为“纯净”就代表一尘不染,连一个文件都不能碰,这个概念其实需要掰开揉碎讲清楚,我的世界纯净服务器到底能装什么MOD?咱们从服务器架构聊到具体推荐清单……

    2026年9月6日
    01671

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注