mcpField
R
roblox-networking

roblox-networking

github.com/nonlooped开发24332 次安装1 周前更新
代码仓库

关于 roblox-networking

面向 Roblox 开发的网络安全与客户端—服务器通信参考技能,涵盖权限边界、远程调用和常见漏洞防护,并提供限流脚本及专题参考。

主要功能

  1. 01客户端—服务器权限原则
  2. 02RemoteEvent 与 RemoteFunction 用法
  3. 03服务端验证与状态权威
  4. 04网络所有权与物理验证
  5. 05常见漏洞防护策略
  6. 06每玩家限流脚本

适用场景

  1. 01审查远程调用参数与频率
  2. 02设计服务端权威的战斗和经济逻辑
  3. 03检查车辆等物理对象的网络所有权

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nonlooped/roblox-suite --skill roblox-networking

安装后在 Claude Code 中输入/roblox-networking确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
exploits-and-defenses.md
remote-and-bindable-patterns.md
server-authority-and-validation.md
scripts/
RateLimiter.lua
tests/
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 是共享单例。

参考索引

评论

支持 Markdown