在深入研究安全開發和防止作弊的具體策略之前,了解 Roblox 安全的基礎原則至關重要。一個安全的體驗是建立在預測敵對行為的心態之上。在編寫任何一行代碼之前,您必須內化這些基礎原則。這些原則應該影響您做出的每一個架構和設計決策。
永遠不相信客戶端
這是基礎原則。一個決心的利用者對其本地狀態和網絡流量擁有完全的控制權。由於利用者擁有這種控制權,所有依賴於客戶端執行的安全措施最終都將被繞過。這不是 Roblox 的限制:而是客戶端-服務器架構的基本現實。假設從客戶端發送的每一個數據片段都已被篡改、偽造或以惡意意圖發送。這包括以下能力:
- 反編譯任何複製的 LocalScript 或任何 ModuleScript,即使它們從未在客戶端運行
- 獲取其角色和任何未固定部件的網絡擁有權
- 在任何範圍或頻率上觸發客戶端啟動的事件,例如 Touched 事件或 ProximityPrompt 激活
- 修改其玩家的位置、物理狀態或與世界的互動
- 以任意頻率以任意參數(除了第一個 Player 參數)觸發或調用 RemoteEvents 和 RemoteFunctions
- 在不觸發任何預期事件的情況下更改其本地 DataModel 中的任何內容
- 任意改變任何本地運行代碼的行為
因此,所有關鍵邏輯必須在服務器端進行驗證或僅在服務器運行。這種控制的後果在 網絡擁有權、運動驗證和物理利用 和 訪問控制和保密性 中有詳細說明。
服務器權威
服務器必須是所有模擬狀態、規則、玩家進度和關鍵決策的最終真實來源。客戶端的角色是渲染世界並將用戶輸入發送到服務器。
服務器的角色是:
- 接收來自客戶端的輸入
- 驗證請求的動作是否可能和允許
- 執行該動作並更新其權威狀態
- 將結果複製到所有相關客戶端
例如,如果玩家說「我想買一瓶 Bloxy Cola」,服務器必須知道該物品的真實價格、玩家的金錢和玩家角色與商店的實際距離,然後才能驗證並批准交易。儘可能,需驗證的狀態應由服務器獨立維護,而不是由客戶端維護。在這個例子中,如果 Bloxy Cola 的交易獲得批准,服務器應該從玩家的金錢中減去 Bloxy Cola 的價格,但服務器不一定能始終控制玩家的角色。
以設計為安全
從一開始就將安全考量融入您體驗的設計中,而不是試圖在事後將它們附加上去。
- 對每個新功能進行威脅建模。對於每個新功能,問自己:
- 如果攻擊者完全控制其客戶端,他們如何利用這一點?
- 如果客戶端可以為功能中使用的任何參數發送任何值,最糟糕的結果是什麼?
- 如果這個功能每秒使用 1,000 次以上會發生什麼?它應該使用的最大頻率是多少?
- 利用者是否可能利用這一點來破壞其他玩家的體驗?
- 在最糟糕的情況下,這個功能可能會使用多少資源?
- 我需要為這個功能暴露的最低內部信息或狀態是什麼?
- 及早劃分責任。從第一天開始就將邏輯和數據保留在 ServerScriptService 中。不要將它們放在 ReplicatedStorage 或 Workspace 這樣的復制容器中。