首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >体育直播系统积分流水与风控开发:防刷、防伪与限频实现

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

原创
作者头像
用户10027718
发布2025-08-14 11:51:19
发布2025-08-14 11:51:19
1220
举报

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


一、设计目标

  1. 积分流水透明可追溯
  • 每笔积分变动都有记录,包括来源、用途、时间、设备、IP 等。
  • 防刷策略
  • 防止用户通过刷接口、重复任务、脚本程序获取积分。
  • 限频控制
  • 对日任务、签到、分享等操作设置频率限制。
  • 防伪与设备识别
  • 通过设备指纹、IP、账号行为分析,检测异常积分行为。

二、防刷策略

1. 接口频率控制

  • 对敏感接口(签到、分享)进行 接口请求限流
  • 可使用 Redis 计数器和过期时间实现:
代码语言:php
复制
// 每日签到积分限额示例
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 大量请求限制
代码语言:php
复制
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. 行为分析防刷

  • 短时间完成不合理数量的任务 → 标记为风险
  • 异常积分操作 → 暂停账号或人工复审
代码语言:php
复制
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;
}

三、积分流水与溯源

  • 数据库设计
代码语言:sql
复制
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 哈希表 + 过期时间实现日限额
  • 结合 消息队列 异步更新积分,减少并发风险
代码语言:php
复制
// 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 检测、行为分析
  • 防伪
  • 积分流水可追溯、消息队列异步写日志、异常标记
  • 限频
  • 日限额、每小时次数限制、比赛/任务限制
  • 积分系统核心
  • MySQL 存储历史流水,Redis 做实时频率统计
  • 结合 WebSocket 或消息队列异步推送积分更新

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、设计目标
  • 二、防刷策略
    • 1. 接口频率控制
    • 2. 设备与IP识别
    • 3. 行为分析防刷
  • 三、积分流水与溯源
  • 四、限频设计
  • 五、总结思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档