关于 roblox-networking
面向 Roblox 开发的网络安全与客户端—服务器通信参考技能,涵盖权限边界、远程调用和常见漏洞防护,并提供限流脚本及专题参考。
主要功能
- 01客户端—服务器权限原则
- 02RemoteEvent 与 RemoteFunction 用法
- 03服务端验证与状态权威
- 04网络所有权与物理验证
- 05常见漏洞防护策略
- 06每玩家限流脚本
适用场景
- 01审查远程调用参数与频率
- 02设计服务端权威的战斗和经济逻辑
- 03检查车辆等物理对象的网络所有权
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nonlooped/ roblox-suite --skill roblox-networking安装后在 Claude Code 中输入/roblox-networking确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/exploits-and-defenses.mdremote-and-bindable-patterns.mdserver-authority-and-validation.mdscripts/RateLimiter.luatests/RateLimiter.spec.lua详细介绍
roblox-networking
核心来源: https://create.roblox.com/docs/projects/client-server 、https://create.roblox.com/docs/scripting/security/security-tactics(服务器权威技术)、整个 scripting/security/ 部分(security-tactics、defensive-design、client-server-boundary、network-ownership、access-control 等)、events/remote 和 bindable,以及相关的 Engine 类(RemoteEvent、RemoteFunction、Bindable*、RunService 等)。
权威边界
服务器对游戏状态和模拟拥有权威。客户端负责模拟以提升响应速度,并渲染服务器告知的内容。任何可能被滥用的内容(经济系统、进度、战斗结果、竞技游戏中的移动)都必须由服务器验证或模拟。
通信工具
RemoteEvent。跨边界单向发送,不等待响应。
- 客户端 → 服务器:
RemoteEvent:FireServer(...)→ 服务器处理程序接收(player, ...) - 服务器 → 客户端:
FireClient(player, ...)或FireAllClients(...)
RemoteFunction。请求/响应(会挂起等待)。
- 客户端:
InvokeServer(...)→ 服务器OnServerInvoke(player, ...) - 服务器可以 InvokeClient(较少使用,也有注意事项)。
重要警告:
RemoteFunction:InvokeClient会让服务器等待,直到目标客户端返回值。恶意或延迟过高的客户端可能使调用一直处于等待状态,导致服务器无限期挂起。避免从服务器调用客户端;如果必须这样做,请设置超时,并将客户端视为不可信对象。
BindableEvent / BindableFunction。仅限同侧使用(服务器模块之间通信,或客户端模块之间通信)。它们始终位于网络边界的同一侧。
通用规则:客户端发送意图。服务器决定结果并复制该结果(或交由 Instance 的常规复制机制处理)。
服务器权威技术
- 验证每个客户端操作(距离、频率、前置条件、耐力、视线等)。
- 在服务器上模拟关键系统(或至少重新执行重要部分)。
- 使用服务器端表或 Attributes 作为事实来源,而不是 leaderstats 或客户端可见的值。
- 对于竞技游戏中的移动/物理:依赖 Roblox 物理系统 + 网络所有权 + 服务器验证/修正。
- 仅复制每个客户端需要的内容(不要每帧广播整个库存)。
有关移动验证、物理等内容,请参阅官方的服务器权威技术页面。
网络所有权
未锚定的零件和装配体具有网络所有者(通常根据距离和客户端能力,由最近的玩家或服务器拥有)。所有者会在本地模拟物理,以降低延迟。服务器可以调用 BasePart:SetNetworkOwner(player or nil) 来设置整个相连装配体的所有权。锚定零件始终由服务器拥有,且无法手动重新分配。
这对载具、投射物、可推动物体等至关重要。误用会导致其他玩家看到橡皮筋效应,或让人轻易利用漏洞。
常见漏洞类型与防御措施
- 加速/飞行/穿墙:验证服务器端移动,或由服务器拥有物理控制权并进行纠正。
- 远程调用滥用/复制物品:按玩家进行速率限制、设置服务器端冷却时间,并验证参数。
- 注入 LocalScript/免费模型后门:审查资源、使用能力,并进行服务器端验证。
- 篡改 leaderstats 或客户端可见的值:将它们仅视为显示用途;权威状态应保存在服务器表或 DataStore 中。
- 信息泄露:不要将机密模型放在会复制的位置;使用流式传输、仅服务器可访问的存储空间(ServerStorage/ServerScriptService),并避免将敏感几何体/触发器放在客户端可见的位置。
CanQuery和碰撞组不是保密控制措施;它们只影响空间查询和物理碰撞,不影响复制或渲染。
速率限制模式(简单但有效): 按玩家和操作类型记录上次操作时间。在 Remote 上检查时间差。对于滥用行为发出警告或踢出玩家。
能力(实验性安全层):
脚本能力可让你精细限制脚本获准执行的操作。目前此功能仍处于实验阶段。若要使用,请设置 Workspace.SandboxedInstanceMode = Enum.SandboxedInstanceMode.Experimental,然后设置 Sandboxed = true,并为脚本或父级容器(Model/Folder)指定一个 SecurityCapabilities 值。这会将脚本限制为仅能使用其能力集中的功能。
访问控制与保密性
- 客户端可见的内容:通过 Instance 流式传输进行控制;如果客户端不应知道确切布局,就不要将敏感几何体放在 Workspace 中;尽可能使用仅服务器可访问的容器。
- 机密数据(确切的经济系统公式、掉落率、反作弊参数)应保留在服务器上。
安全的货币化与数据流(与其他技能的关联)
- 在客户端提示购买。
- 对于游戏通行证:只有在
PromptGamePassPurchaseFinished中确认wasPurchased == true时才授予权益,并在PlayerAdded时通过UserOwnsGamePassAsync重新验证所有权。 - 对于开发者产品和订阅:只能在服务器端的
ProcessReceipt回调中验证并授予权益。 - 只能从服务器 Script 写入 DataStore。
- 任何声称“我买了 X,给我物品”的客户端 Remote 都必须忽略,或仅作为提示并在服务器上重新验证。
实用的放置规则
- 权威逻辑、经济系统、进度、战斗结算、DataStore 访问 → ServerScriptService 或仅服务器可访问的模块。
- UI、输入处理、外观预测、本地 VFX → 客户端(LocalScripts 或位于 PlayerGui 下的客户端模块,或从 ReplicatedStorage 引入并使用 IsClient 分支的模块)。
- 共享的纯函数/常量/Remote 定义 → ReplicatedStorage 模块(两端都会加载,但会在各自的上下文中执行)。
不确定时,请在所有位置使用 RunService 上下文检查。
脚本
scripts/RateLimiter.lua:经过审查的按玩家/操作限制器,具有硬性最小间隔、令牌容量/补充机制、有限的操作键分配和拒绝原因。对于专用实例,请调用destroy()断开清理连接;RateLimiter.default是共享单例。
参考索引
- exploits-and-defenses.md:审查移动漏洞、远程调用滥用、资源后门或数据泄露。
- remote-and-bindable-patterns.md:选择事件或函数,或定义通信载荷。
- server-authority-and-validation.md:验证远程参数、强制执行冷却时间,或审查客户端预测。