移动/游戏
Roblox 脚本防利用:编写或审查…
适用于 Roblox 游戏中处理玩家动作、货币、属性、伤害或 RemoteEvent/RemoteFunction 通信的脚本编写与安全审查。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
Roblox 脚本防利用:编写或审查 R特定
解决思路
- 核心原则:永不信任客户端;每个 LocalScript 都在玩家机器上运行且可被修改,所有权威逻辑(伤害、货币、属性、位置变更)必须放在服务器。
- 理解 FilteringEnabled 在现代 Roblox 中始终开启:客户端改动不会复制到服务器或其他客户端,除非服务器显式应用。
- 伤害处理:不要用 LocalScript 设置 Humanoid.Health;应由服务器验证后再扣减生命值。
- 货币发放:不要用 LocalScript 增加 leaderstats;应由服务器验证动作后再增加。
- leaderstats 归属:不要由 LocalScript 拥有 IntValue;应由服务器创建并拥有所有 leaderstats。
- 位置变更:不要由 LocalScript 传送角色;应由服务器验证后移动角色。
- 工具使用:不要客户端命中后 FireServer 伤害;应由服务器 raycast 并施加伤害。
- 冷却:不要客户端本地记录冷却;应由服务器按玩家记录冷却。
- 安全 leaderstats 设置:在 ServerScriptService 中用 Script(绝不 LocalScript)监听 Players.PlayerAdded,创建 Folder 名为 leaderstats 并 parent 到 player,再创建 IntValue(如 Coins)并 parent 到 leaderstats。
- 距离检查:定义 MAX_INTERACT_DISTANCE=10;在 RemoteEvent.OnServerEvent 中验证 targetPart 是 Instance 且 IsA('BasePart'),获取 player.Character 的 HumanoidRootPart,若距离超过上限则 warn 并 return,否则处理交互。
- 冷却验证:定义 ABILITY_COOLDOWN=5 和 lastUsed 表;在 OnServerEvent 中用 os.clock() 检查 now - lastUsed[player] < cooldown 则 return;通过则更新 lastUsed[player] 并应用能力;在 Players.PlayerRemoving 清理 lastUsed[player]。
- 属性/数量边界检查:定义 MAX_QUANTITY=99 和 ITEM_COST=50;在 OnServerEvent 中检查 quantity 是 number,用 math.clamp(math.floor(quantity),1,MAX_QUANTITY) 限制;检查 player.leaderstats.Coins.Value 是否足够;足够则扣除并在服务器发放物品。
- 限流:定义 RATE_LIMIT=10 和 RATE_WINDOW=1(每秒);callLog 表按玩家记录调用时间;isRateLimited 中裁剪窗口外时间戳,若窗口内数量 >= RATE_LIMIT 返回 true,否则加入当前时间并返回 false;OnServerEvent 中若被限流则 return,否则处理;PlayerRemoving 清理 callLog[player]。
- 参数验证工具:创建 ServerScriptService/Modules/Validate.lua;Validate.number(value,min,max) 检查 type 是 number、非 NaN(value ~= value)、满足 min/max;Validate.instance(value,className) 检查 typeof 是 Instance 且可选 IsA(className);Validate.string(value,maxLength) 检查 type 是 string 且长度不超过 maxLength。
- 使用参数验证:require Validate 模块;在 remote.OnServerEvent 中先 Validate.number(amount,1,100),再 Validate.instance(targetPart,'BasePart'),都通过才继续。
- 速度/反作弊检测:定义 SPEED_LIMIT=32 和 violations 表;task.spawn 中 while true 每 task.wait(2) 遍历玩家;若 HumanoidRootPart 存在且 AssemblyLinearVelocity.Magnitude > SPEED_LIMIT,则 violations[player] 加 1,达到 3 次则 player:Kick('Cheating detected.');否则 violations[player] 减 1 且不低于 0。
- 模块放置:ServerScriptService/Modules 放仅服务器模块,如 DamageCalculator.lua、EconomyManager.lua,绝不暴露给客户端。
- ReplicatedStorage 放置:ReplicatedStorage/Remotes 只放 RemoteEvent/RemoteFunction 实例;ReplicatedStorage/SharedModules 只放非敏感工具。
- 禁止敏感模块:绝不要把货币、伤害或 DataStore 逻辑放在 ReplicatedStorage 的模块中,因为客户端可以 require() 它们。
- 避免错误:不要 FireServer(damage) 并让服务器信任;服务器应基于自己的工具数据计算伤害。
- 避免错误:不要把货币放在 LocalScript 变量中;只能由服务器拥有。
- 避免错误:不要在客户端做距离检查后就触发;服务器收到事件后必须重新检查。
- 避免错误:不要没有 RemoteEvent 处理器的冷却;否则刷事件可无限获取资源;在服务器上按玩家冷却。
- 避免错误:不要信任客户端设置的 WalkSpeed;服务器拥有并限制 WalkSpeed。
- 避免错误:不要把敏感逻辑放在 ReplicatedStorage 模块;移到 ServerScriptService。
适用边界 · 注意事项
- 不适用于非 Roblox 平台;本经验依赖 ServerScriptService、ReplicatedStorage、RemoteEvent/RemoteFunction 和 FilteringEnabled 等 Roblox 概念。
- 不适用于纯本地单机原型或只影响本机视觉、UI 的效果;但一旦涉及货币、伤害、属性、位置或跨客户端状态,就应使用服务器权威。
- 如果已有可信的服务器框架或反作弊系统覆盖这些检查,不要盲目重复实现,以免逻辑冲突或维护两份规则。