为了账号安全,请及时绑定邮箱和手机立即绑定

体育直播系统积分流水与风控开发:防刷、防伪与限频实现

标签:
PHP

本案例分享介绍的是 “东莞梦幻网络科技”体育直播系统的积分流水与风控策略设计,并附上核心实现思路和部分示例代码(基于 ThinkPHP + MySQL + Redis + WebSocket 等技术栈)。从三个层面讲:防刷、防伪、限频。


一、设计目标

  1. 积分流水透明可追溯

    • 每笔积分变动都有记录,包括来源、用途、时间、设备、IP 等。
  2. 防刷策略

    • 防止用户通过刷接口、重复任务、外挂程序获取积分。
  3. 限频控制

    • 对日任务、签到、分享、趣猜等操作设置频率限制。
  4. 防伪与设备识别

    • 通过设备指纹、IP、账号行为分析,检测异常积分行为。

二、防刷策略

1. 接口频率控制

  • 对敏感接口(签到、分享、趣猜)进行 接口请求限流
  • 可使用 Redis 计数器和过期时间实现:
// 每日签到积分限额示例
function canAddPoints($userId, $taskType) {
    $redisKey = "points:{$userId}:{$taskType}:" . date('Ymd');
    $maxDaily = 1; // 每日签到1次积分
    $current = \think\facade\Cache::get($redisKey) ?? 0;

    if ($current >= $maxDaily) {
        return false;
    }
    return true;
}

function addPoints($userId, $taskType, $points) {
    if (!canAddPoints($userId, $taskType)) {
        return false;
    }
    // 写入积分流水
    Db::name('points_log')->insert([
        'user_id' => $userId,
        'task_type' => $taskType,
        'points' => $points,
        'ip' => request()->ip(),
        'device' => request()->header('User-Agent'),
        'created_at' => time(),
    ]);

    // 更新Redis计数
    $redisKey = "points:{$userId}:{$taskType}:" . date('Ymd');
    \think\facade\Cache::inc($redisKey, 1, 86400); // 设置过期1天

    return true;
}

2. 设备与IP识别

  • 防止同一用户在多设备、多账号刷积分:

    • 设备指纹:浏览器指纹、设备ID、MAC 地址(App 端)
    • IP 黑名单:短时间内同 IP 大量请求限制
function isDeviceNormal($userId) {
    $device = request()->header('User-Agent');
    $ip = request()->ip();
    
    // 检测设备同日重复行为
    $cacheKey = "device_check:{$device}:" . date('Ymd');
    $count = \think\facade\Cache::get($cacheKey) ?? 0;
    if ($count > 5) return false;

    \think\facade\Cache::inc($cacheKey, 1, 86400);
    return true;
}

3. 行为分析防刷

  • 短时间完成不合理数量的任务 → 标记为风险
  • 异常积分操作 → 暂停账号或人工复审
function riskCheck($userId, $taskType) {
    $logs = Db::name('points_log')
        ->where('user_id', $userId)
        ->where('task_type', $taskType)
        ->where('created_at', '>=', strtotime('-1 hour'))
        ->count();
    
    if ($logs > 10) { // 1小时超过10次任务积分异常
        Db::name('user')->where('id', $userId)->update(['status' => 2]); // 账号冻结
        return false;
    }
    return true;
}

三、积分流水与溯源

  • 数据库设计
CREATE TABLE `points_log` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT,
    `user_id` bigint unsigned NOT NULL,
    `task_type` varchar(50) NOT NULL,
    `points` int NOT NULL,
    `ip` varchar(50),
    `device` varchar(255),
    `remark` varchar(255),
    `created_at` int NOT NULL,
    PRIMARY KEY (`id`),
    INDEX(`user_id`),
    INDEX(`task_type`),
    INDEX(`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 特点

    • 每笔积分都可追溯来源、设备、IP、时间
    • 结合 Redis 限流防刷

四、限频设计

类型 限制策略
每日签到 每天 1 次
分享任务 每小时 1 次
趣猜比分 每场比赛 1 次
充值返积分 单日上限 500
  • 可使用 Redis 哈希表 + 过期时间实现日限额
  • 结合 消息队列 异步更新积分,减少并发风险
// Redis 哈希记录每日积分上限
$redisKey = "daily_points_limit:{$userId}:" . date('Ymd');
$current = \think\facade\Cache::hGet($redisKey, $taskType) ?? 0;
$limit = 100;

if ($current + $points > $limit) {
    return false; // 超过日限额
}
\think\facade\Cache::hSet($redisKey, $taskType, $current + $points);

五、总结思路

  1. 防刷

    • 接口频率限制、设备指纹、IP 检测、行为分析
  2. 防伪

    • 积分流水可追溯、消息队列异步写日志、异常标记
  3. 限频

    • 日限额、每小时次数限制、比赛/任务限制
  4. 积分系统核心

    • MySQL 存储历史流水,Redis 做实时频率统计
    • 结合 WebSocket 或消息队列异步推送积分更新
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消