存取控制與機密性

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

瞭解客戶端可見的資訊和資產對於維護您的體驗的安全性和機密性至關重要。開發者們常常低估了可被利用者看到的內容以及轉移到客戶端的內容。利用者能夠訪問您宇宙中“受限”的地點,只要他們能夠加入一個地方。他們可以查看任何複製到其客戶端的內容,無論該內容是否可見或當前是否在使用中。此外,利用者可以反編譯任何複製的本地腳本和ModuleScripts,即使它們在客戶端上從未執行過。

宇宙中的客戶端傳送

一旦進入宇宙,客戶端可以傳送到該宇宙中的任何地點,可能會繞過任何意圖中的訪問限制或進度門檻。這也可能導致未公開內容的意外洩漏,例如來自開發或預備體驗的內容。重要的是要理解:

  • 禁用“直接訪問”僅會從網站上移除子地點的加入按鈕——這並不阻止客戶端發起的傳送
  • 假設利用者會發現您宇宙中所有子地點的存在
  • 如果客戶端可以訪問一個地方,例如根地點,則可以傳送到任何子地點,無論您的意圖設計流程如何

許多開發者試圖通過將未授權用戶從子地點踢出來來防止訪問。這可能對於阻止遊戲進行有效,但它並能防止內容複製到客戶端,因為複製在玩家加入時即開始,且在伺服器端踢出邏輯執行之前。

使用安全傳送

防止未授權訪問的最有效方法是將地點存取控制設置為僅限宇宙內安全在創作者儀表板中。這將所有非啟動地點限制為僅可由伺服器發起的傳送,阻止客戶端發起的傳送在玩家加入子地點之前就被平臺層級阻擋。因為玩家從未加入,所以沒有內容會複製給他們。

有關配置步驟和現有體驗的遷移指導,使用客戶端發起的傳送,請參見在地點之間傳送

受限地點的深度防禦

對於無法使用安全傳送的宇宙,或者作為額外的保護層,結合以下措施:

  • 將開發和測試地點放在分開的私人宇宙中——這是確保未公開內容機密性的唯一可靠方法。請勿在未打算啟用之前將機密事件資產、腳本或UI元素發佈到生產環境中。
  • 如果可行,使用串流來限制新玩家可複製的世界內容。
  • 添加伺服器端的群組角色或徽章驗證,並驗證玩家狀態或進度要求。
  • 默認情況下,禁止新玩家進入。這可確保即使驗證過程不確定(例如引擎拋出異常),也不會允許任何玩家進入。
  • 如果可行,對於未通過驗證的玩家使用Ban API。這可以防止玩家在同一帳號上不斷嘗試加入。

複製

複製描述了狀態如何在引擎的實例之間透過網絡傳輸。Roblox的複製模型在幾個關鍵方面通常是簡化的:

  • 實例是伺服器主導的,這意味著要將實例複製到所有參與者(伺服器和所有連接的客戶端)之間,則必須在伺服器上創建。
  • 實例屬性也是伺服器主導的,這意味著大多數屬性必須在伺服器上更改,才能在所有客戶端上可見變化。
  • 通常來說,實例要麼複製到所有連接的客戶端,要麼不複製。有一些例外情況,例如串流。

複製容器是位於DataModel下的頂級實例,會複製到客戶端。如果一個實例在其生命週期中成為複製容器的後代,則您應該預期其狀態的大部分會複製到所有客戶端。您可以在數據模型指南中閱讀有關常見複製容器的更多信息。若您有疑問,您可以隨時在像Play Solo這樣的測試環境中檢查實例或屬性的複製情況。您可以在Studio測試模式中閱讀有關測試模式的更多信息。

複製的安全性影響

任何複製到客戶端的內容都可以被利用者提取和數據挖掘。一般而言,避免在直播生產環境中發佈或運送任何機密內容,除非您已準備好其立即被用戶看到。即使在體驗中有邏輯門控內容的發布或訪問直到稍後(或某些其他條件)也發生,請假設利用者會找到方法發現並洩漏您的內容,並在它發佈後立即這樣做。

對於敏感實例,避免使用過於描述性或可預測的名稱,包括但不限於:腳本、遠程和模型。擁有可預測的DataModel層次結構會使開發漏洞更容易。

腳本反編譯

任何LocalScriptScript(具有RunContext::Client)或ModuleScript,一旦複製到客戶端,就可以被利用者反編譯,即使這些腳本被禁用、從未要求或從未在客戶端上運行。存儲在ServerStorageServerScriptService中的僅伺服器用腳本和ModuleScripts無法被反編譯,因為它們從不複製到客戶端。

在同一腳本中編寫包含僅伺服器和僅客戶端代碼的ModuleScript是不明智的,因為伺服器邊邊的邏輯會在反編譯中暴露,並且更容易被分解以查找可能被利用的漏洞。

原始ModuleScript在ReplicatedStorage中

local module = {}
local Remote = script:WaitForChild("RemoteEvent")
-- 這裡有一個避免的範例
-- 將伺服器碼保留在Script實例或ServerStorage/ServerScriptStorage中!
if game:GetService("RunService"):IsServer() then
function module:DoServerThing(password)
if password == "SecretPassword" then
print("敏感伺服器代碼")
end
end
Remote.OnServerEvent:Connect(function(player, password)
module:DoServerThing(password)
end)
else
function module:DoServerThing(password)
Remote:FireServer(password)
end
end
return module
反編譯結果

local table1 = {};
local RemoteEvent = script:WaitForChild("RemoteEvent");
if game:GetService("RunService"):IsServer() then
function table1.DoServerThing(_, p2) -- 行:9
if p2 == "SecretPassword" then
print("敏感伺服器代碼");
end
end
RemoteEvent.OnServerEvent:Connect(function(player: Player, p3) -- 行:15
--[[
上值:
[1] = table1
--]]
table1:DoServerThing(p3);
end);
return table1;
end
function table1.DoServerThing(_, p1) -- 行:19
--[[
上值:
[1] = RemoteEvent
--]]
RemoteEvent:FireServer(p1);
end
return table1;

正如上面所示,反編譯顯示了伺服器端邏輯,包括硬編碼密碼、商業規則和實現細節,這些都可以被利用者分析以尋找漏洞。

機密性違規的影響

機密性違規可能會帶來重大後果,例如:

  • 內容洩漏:未發佈的物品、地圖或功能可能在官方公告之前被發現並公開分享
  • 競爭劣勢:競爭對手可能會對機械、算法或即將推出的功能進行逆向工程
  • 漏洞開發:暴露的伺服器邏輯使得利用者更快、更容易地識別漏洞並發展針對性攻擊
©2026 Roblox Corporation、Roblox、Roblox 標誌及 Powering Imagination 是我們在美國及其他國家地區的部分註冊與未註冊商標。