SuperAPI AI 工具集

roblox-security

安全与审计

查看项目

更新于 10-15 13:55

技能介绍

用途

本技能用于 Roblox 平台的反作弊与安全设计。其基本前提是:作弊者完全控制自己的客户端——他们可以运行任意 Luau、读取每一个被复制的脚本(反编译)、以任意参数和任意频率触发任何远程事件、修改任何本地属性(WalkSpeed、prompt 的 Enabled、MaxActivationDistance),并移动任何他们拥有网络所有权的对象。客户端反作弊充其量只是减速带,安全性来自服务器端设计。

核心规则

  • 服务器做决定。客户端发送意图(“我按了攻击,瞄准这里”),绝不发送结果(“我造成了 50 点伤害”“给我 100 金币”)。
  • 校验每个 OnServerEvent/OnServerInvoke 的每个参数:类型、结构、范围、有限性。
  • 校验上下文:玩家是否存活、是否在范围内、是否在冷却中、是否拥有该物品、是否有权行动。
  • 对客户端可触发的一切进行限流(远程事件、prompt、触碰、点击)。
  • 机密保留在服务端:服务器代码放在 ServerScriptService/ServerStorage;API 密钥通过 HttpService:GetSecret() 获取;绝不把未发布内容部署到生产场所。
  • 优先静默缓解(丢弃、钳制、修正状态)而非立即踢出;对重复信号再升级处理。

参数校验工具

技能提供 Validate 模块(ServerScriptService/Server/Validate.luau),包含:

  • Validate.number:拒绝非数字、NaN 和 ±inf(NaN 会使所有比较失败,因此仅靠范围检查无法捕获)。
  • Validate.integer:在 number 基础上要求为整数。
  • Validate.string:限制最大长度,并拒绝无效 UTF-8(DataStore 会拒绝此类字符串)。
  • Validate.vector3:校验各分量为有限值,并限制向量模长。
  • Validate.instanceIn:只接受位于可信容器下、属于预期类的真实实例;作弊者可发送形似实例的表(如 { ClassName = "Part", ... })。
  • Validate.enum:只接受白名单中的枚举值。

使用要点:把每个处理函数中 player 之后的参数都视为 unknown,用这些辅助函数收窄;物品通过服务器表中的 ID 查找(ITEMS[itemId]),绝不从客户端数据或客户端可引用的复制 NumberValue 读取价格/属性;限制表大小并防御性地遍历客户端表(键可能是类 NaN、嵌套、超大)。

限流(令牌桶)

技能给出 newLimiter(capacity, windowSeconds) 实现:按玩家维护令牌桶,在 PlayerRemoving 时清理,返回一个判断是否放行的函数。示例 newLimiter(5, 1) 表示突发 5 次、每秒回填 5 次。应特别对昂贵或易被利用的操作限流:DataStore/Badge/HTTP 调用(它们有自身预算)、克隆大型模型、传送、发放货币、向所有客户端广播的内容。

客户端可触发对象并不安全

  • ProximityPrompt:作弊者可在禁用时触发事件,本地修改距离/视线/HoldDuration;只有 Triggered 会做距离检查。服务器必须重新检查启用状态、与角色的距离、存活、冷却。
  • ClickDetector:可从任意距离触发,即使被禁用;完全没有服务器检查。处理同上。
  • DragDetector:继承的点击事件不受检查;拖拽只遵守 Enabled 和 PermissionPolicy。需在服务器校验拖拽结果。
  • 客户端拥有部件上的 Touched:可伪造或抑制触碰。需用服务器端距离/重叠查询校验。

若这些对象位于客户端可拥有的未锚定部件上,作弊者可将部件拉向自己:应锚定它们,或对部件调用 part:SetNetworkOwner(nil) 交由服务器拥有。

网络所有权与移动

客户端拥有其角色的物理,因此可以传送、飞行、穿墙、加速、甩飞其他玩家(NaN/巨大速度),并抑制 Touched。可选方案(由强到弱):

  1. 服务器权威(Workspace AuthorityMode = Server;2026 年逐步推出——请查看当前状态):服务器用客户端预测与回滚模拟移动,消除移动类作弊。参见 roblox-physics。
  2. 服务器端移动检查:按间隔比较水平(XZ)位移与最大速度加延迟容差;豁免合法传送(由服务器移动玩家时在服务端设置标志);回拉到最后一个有效位置而非踢出。
  3. 保持玩法关键的未锚定部件为服务器所有:part:SetNetworkOwner(nil)。

战斗校验(命中报告)

客户端发送起点、方向/目标部件和时间戳。服务器检查:起点靠近角色的服务器位置(容差按 player:GetNetworkPing() 缩放);目标是存活敌人且在武器射程内,声称的命中点靠近目标的服务器位置;对静态几何体做服务器射线检测,确认起点与目标之间无墙;射速、弹药、装填/冲刺状态由服务器跟踪。

经济、交易与购买

货币、库存和价格只存在于服务器。客户端请求,服务器检查余额并原子地应用变更。交易:完整校验双方,然后提交双方,再保存双方;任何失败则全部回滚。注意“交易后保存前离开”造成的复制漏洞:交易期间锁定物品,交易后立即保存。Robux 购买:仅在 MarketplaceService.ProcessReceipt(开发者产品)中授予,或在服务器所有权检查(通行证)后授予;绝不信任来自客户端的 PromptProductPurchaseFinished。参见 roblox-monetization。

机密性

任何会被复制的 LocalScript、客户端 Script 或 ModuleScript 都可被反编译——即使被禁用或从未被 require。不要把仅服务器分支混入共享模块。任何被复制的内容(模型、UI、属性)都可被数据挖掘;未发布内容应放在独立的私有宇宙中,而非隐藏在生产环境里。客户端可传送到宇宙中的任何场所:在 Creator Dashboard 中为 Places → Access Control 设置 Secure within universe only,并在受限场所的加入时校验资格(默认拒绝)。绝不把 API 密钥放进脚本或属性;使用体验内 Secrets 存储(HttpService:GetSecret)。

检测与后果

在校验之上叠加服务器端启发式:最快可能完成时间、资源获取速率、非人类的规律操作节奏、无合法客户端会触发的蜜罐远程事件。累积可疑分数,基于多个信号行动。阶梯为:静默记录 → 静默缓解 → 限制功能 → 踢出/封禁。延迟可见后果,使作弊者无法二分定位你的检查。技能提供 banForExploiting 示例,使用 Players:BanAsync(Duration 秒,-1 为永久;DisplayReason 展示给用户,最多 400 字符并过滤;PrivateReason 仅自己可见;ExcludeAltAccounts 是否连带封禁小号;ApplyToUniverse 是否应用于整个宇宙),失败时回退到 Kick。需启用 Players.BanningEnabled 才能使用 Ban API。优先可逆、有时限的封禁(用 Players:GetBanHistoryAsync 升级),对检测规则做版本管理并监控误报率。

适用场景与限制

适用于 Roblox 体验的服务器端安全设计、远程事件校验、限流、移动与战斗校验、经济与交易防复制、购买授予、机密保护与作弊处罚。安全审查清单与常见易受攻击代码模式见 references/checklist.md。相关技能:roblox-networking、roblox-physics(所有权、服务器权威)、roblox-data-stores、roblox-monetization、roblox-code-review。

限制与注意事项:服务器权威移动(AuthorityMode = Server)在 2026 年逐步推出,需查看当前状态;BanAsync 需启用 Players.BanningEnabled;具体平台支持范围、收费与价格信息暂未提供。