การควบคุมการเข้าถึงและความเป็นส่วนตัว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

การเข้าใจว่าสิ่งที่ข้อมูลและทรัพย์สินใดที่มองเห็นได้โดยลูกค้าเป็นสิ่งสำคัญสำหรับการรักษาความปลอดภัยและความเป็นส่วนตัวของประสบการณ์ของคุณ ผู้พัฒนามักจะประเมินค่าต่ำเกินไปว่าสิ่งใดที่มองเห็นได้โดยผู้หาประโยชน์และถูกทำซ้ำไปยังลูกค้า ผู้หาประโยชน์สามารถเข้าถึงสถานที่ "ที่ถูกจำกัด" ภายในจักรวาลของคุณได้หากพวกเขาสามารถเข้าร่วมสถานที่เดียว พวกเขาสามารถดูเนื้อหาทั้งหมดที่ถูกทำซ้ำไปยังลูกค้า ไม่ว่าจะมองเห็นได้หรือไม่หรือกำลังใช้งานอยู่ก็ตาม นอกจากนี้ ผู้หาประโยชน์สามารถถอดรหัสสคริปต์ท้องถิ่นและ ModuleScripts ที่ถูกทำซ้ำได้ แม้ว่าจะไม่มีการเรียกใช้บนลูกค้าเลยก็ตาม

การใช้การวาร์ปในจักรวาลฝั่งลูกค้า

เมื่ออยู่ในจักรวาล ลูกค้าสามารถวาร์ปไปยังสถานที่ใดก็ได้ภายในจักรวาลนั้น โดยอาจหลีกเลี่ยงข้อจำกัดการเข้าถึงหรือประตูการก้าวหน้าใดๆ ที่ตั้งใจไว้ นี่สามารถนำไปสู่การรั่วไหลของเนื้อหาที่ไม่ได้ปล่อย ในกรณีที่ไม่ได้ตั้งใจ เช่นจากประสบการณ์การพัฒนาหรือการทดสอบ สิ่งสำคัญคือต้องเข้าใจว่า:

  • การปิด "การเข้าถึงโดยตรง" จะลบปุ่มเข้าร่วมจากซับเพลสบนเว็บไซต์เท่านั้น — ไม่ได้ป้องกันการวาร์ปที่เริ่มจากลูกค้า
  • สมมติว่าผู้หาประโยชน์จะค้นพบการมีอยู่ของซับเพลสทั้งหมดภายในจักรวาลของคุณ
  • ลูกค้าสามารถวาร์ปไปยังซับเพลสใดก็ได้หากพวกเขาสามารถเข้าถึงสถานที่เดียว เช่น สถานที่หลัก โดยไม่คำนึงถึงกระบวนการออกแบบที่คุณตั้งใจไว้

นักพัฒนาหลายคนพยายามป้องกันการเข้าถึงโดยการเตะผู้ใช้ที่ไม่ผ่านการตรวจสอบออกจากซับเพลส วิธีนี้อาจใช้ได้สำหรับการบล็อกการเล่นเกม แต่จะ ไม่ ป้องกันการทำซ้ำเนื้อหาไปยังลูกค้า เนื่องจากการทำซ้ำเริ่มต้นขึ้นเมื่อผู้เล่นเข้าร่วม และก่อนที่ลอจิกการเตะจากเซิร์ฟเวอร์จะสามารถดำเนินการได้

ใช้การวาร์ปที่ปลอดภัย

วิธีที่มีประสิทธิภาพที่สุดในการป้องกันการเข้าถึงโดยไม่ได้รับอนุญาตผ่านการวาร์ปคือการตั้งค่า การควบคุมการเข้าถึงสำหรับสถานที่ เป็น ปลอดภัยเฉพาะในจักรวาลเท่านั้น ใน Creator Dashboard ซึ่งจะจำกัดสถานที่ที่ไม่ใช่สถานที่เริ่มต้นทั้งหมดให้ทำการวาร์ปเริ่มจากเซิร์ฟเวอร์เท่านั้น โดยบล็อกการวาร์ปที่เริ่มจากลูกค้าในระดับแพลตฟอร์มก่อนที่ผู้เล่นจะเข้าร่วมซับเพลส เนื่องจากผู้เล่นไม่ได้เข้าร่วมเนื้อหาใดๆ จึงไม่ได้ทำซ้ำไปยังพวกเขา

สำหรับขั้นตอนการกำหนดค่าและคำแนะนำในการย้ายสำหรับประสบการณ์ที่มีอยู่ที่ใช้การวาร์ปที่เริ่มจากลูกค้า ดูที่ การวาร์ประหว่างสถานที่.

การป้องกันเชิงลึกสำหรับสถานที่ที่ถูกจำกัด

สำหรับจักรวาลที่ไม่สามารถใช้การวาร์ปที่ปลอดภัยได้ หรือเป็นชั้นการป้องกันเพิ่มเติมควบคู่ไปกับการวาร์ปที่ปลอดภัย ให้รวมมาตรการต่อไปนี้:

  • เก็บสถานที่พัฒนาและทดสอบไว้ในจักรวาลส่วนตัวที่แยกจากกัน — นี่เป็นวิธีที่เชื่อถือได้เพียงวิธีเดียวในการรับรองความเป็นส่วนตัวสำหรับเนื้อหาที่ยังไม่ได้ปล่อย อย่าส่งทรัพย์สินเหตุการณ์ที่เป็นความลับ สคริปต์ หรือองค์ประกอบ UI ไปยังสภาพแวดล้อมการผลิตก่อนที่พวกเขาจะตั้งใจให้เป็นที่ใช้งาน
  • หากทำได้ ใช้การสตรีมเพื่อลดปริมาณโลกที่ทำซ้ำไปยังผู้เล่นใหม่
  • เพิ่มการตรวจสอบบทบาทของกลุ่มหรือเครื่องรางในฝั่งเซิร์ฟเวอร์ และยืนยันสถานะหรือข้อกำหนดการก้าวหน้าของผู้เล่น
  • โดยค่าเริ่มต้น ปฏิเสธผู้เล่นที่เข้ามา นี่จะทำให้แน่ใจว่าจะไม่มีผู้เล่นได้รับอนุญาตให้เข้าร่วมแม้ว่ากระบวนการตรวจสอบจะไม่ชัดเจน เช่นในกรณีที่เกิดข้อยกเว้นจากเครื่องยนต์
  • หากสามารถทำได้ ใช้ Ban API สำหรับผู้เล่นที่ไม่ผ่านการตรวจสอบ นี่จะช่วยป้องกันไม่ให้ผู้เล่นพยายามเข้าร่วมต่อไปโดยใช้บัญชีเดียวกัน

การทำซ้ำ

การทำซ้ำอธิบายถึงวิธีที่สถานะถูกส่งผ่านเครือข่ายระหว่างอินสแตนซ์ของเครื่องยนต์ รูปแบบการทำซ้ำของ Roblox โดยทั่วไปจะถูกทำให้ง่ายขึ้นในบางวิธีสำคัญ:

  • อินสแตนซ์มีอำนาจการควบคุมจากเซิร์ฟเวอร์ ซึ่งหมายความว่าเพื่อให้มีการทำซ้ำระหว่างผู้เข้าร่วมทั้งหมด (เซิร์ฟเวอร์และลูกค้าที่เชื่อมต่อทั้งหมด) จะต้องถูกสร้างขึ้นบนเซิร์ฟเวอร์
  • คุณสมบัติของอินสแตนซ์ก็มีอำนาจการควบคุมจากเซิร์ฟเวอร์เช่นกัน ซึ่งหมายความว่าคุณสมบัติส่วนใหญ่ต้องถูกเปลี่ยนแปลงบนเซิร์ฟเวอร์เพื่อให้การเปลี่ยนแปลงนั้นมองเห็นได้บนลูกค้าทั้งหมด
  • โดยทั่วไปแล้ว อินสแตนซ์จะทำซ้ำไปยังลูกค้าที่เชื่อมต่อทั้งหมดหรือจะไม่ทำซ้ำเลย มีข้อยกเว้นบางประการ เช่น การสตรีม

ตัวเก็บรวบรวมการทำซ้ำเป็นอินสแตนซ์ระดับสูง (อยู่ภายใต้ DataModel) ที่ทำซ้ำไปยังลูกค้า หากมีอินสแตนซ์ใด ๆ ที่กลายเป็นลูกหลานของตัวเก็บรวบรวมการทำซ้ำในระหว่างอายุการใช้งาน คุณควรคาดหวังว่าสถานะส่วนใหญ่ของมันจะทำซ้ำไปยังลูกค้าทั้งหมด คุณสามารถอ่านเพิ่มเติมเกี่ยวกับตัวเก็บรวบรวมการทำซ้ำที่พบบ่อยใน คำแนะนำเกี่ยวกับโมเดลข้อมูล เมื่อไม่แน่ใจ คุณสามารถตรวจสอบได้เสมอว่าอินสแตนซ์หรือคุณสมบัติทำซ้ำอย่างไรในสภาพแวดล้อมทดสอบ เช่น เล่นเดี่ยว คุณสามารถอ่านเพิ่มเติมเกี่ยวกับโหมดการทดสอบใน โหมดการทดสอบของ Studio.

ผลกระทบด้านความปลอดภัยของการทำซ้ำ

เนื้อหาทุกชิ้นที่ทำซ้ำไปยังลูกค้าสามารถถูกขุดและดึงข้อมูลโดยผู้หาประโยชน์ ตามกฎทั่วไป ควรหลีกเลี่ยงการเผยแพร่หรือส่งเนื้อหาที่เป็นความลับไปยังสภาพแวดล้อมการผลิตแบบสด เว้นแต่คุณจะเตรียมพร้อมที่จะให้ผู้ใช้งานเห็น เนื้อหานั้นอย่างรวดเร็ว แม้ว่าจะมีลอจิกที่ควบคุมการปล่อยหรือการเข้าถึงเนื้อหาในประสบการณ์จนถึงวันที่ในอนาคต (หรือเงื่อนไขอื่นใด) ขอให้สมมติว่าผู้หาประโยชน์จะหาแนวทางเพื่อค้นพบและเปิดเผยเนื้อหาของคุณทันทีที่มันถูกเผยแพร่

หลีกเลี่ยงชื่อที่มีรายละเอียดหรือคาดเดาง่ายสำหรับอินสแตนซ์ที่ละเอียดอ่อน รวมถึงแต่ไม่จำกัดเพียง: สคริปต์, รีโมท และโมเดล การมีลำดับชั้นของ DataModel ที่คาดเดาได้ทำให้การพัฒนาการโจมตีทำได้ง่ายขึ้น

การถอดรหัสสคริปต์

สคริปต์ LocalScript, Script ที่มี RunContext::Client, หรือ ModuleScript สามารถถูกถอดรหัสโดยผู้หาประโยชน์เมื่อถูกทำซ้ำไปยังลูกค้าของพวกเขา แม้ว่าสคริปต์ดังกล่าวจะถูกปิด ใช้ไม่เคยเรียกใช้ หรือไม่มีการเรียกใช้บนลูกค้าก็ตาม สคริปต์และ ModuleScripts ที่ทำงานเฉพาะจากเซิร์ฟเวอร์ที่เก็บใน ServerStorage หรือ ServerScriptService จะไม่สามารถถอดรหัสได้ เนื่องจากพวกเขาไม่ได้ทำซ้ำไปยังลูกค้า

การเขียน ModuleScript ที่รวมโค้ดเฉพาะของเซิร์ฟเวอร์และลูกค้าในสคริปต์เดียวไม่แนะนำ เนื่องจากลอจิกที่ทำงานในเซิร์ฟเวอร์จะถูกเปิดเผยในการถอดรหัสและอาจถูกวิเคราะห์เพื่อหา bugs ที่สามารถใช้ประโยชน์ได้มากขึ้น

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;

ตามที่แสดงไว้ข้างต้น การถอดรหัสเปิดเผยลอจิกฝั่งเซิร์ฟเวอร์รวมถึงรหัสผ่านที่กำหนดไว้ล่วงหน้า กฎธุรกิจ และรายละเอียดการดำเนินการที่ผู้หาประโยชน์สามารถวิเคราะห์เพื่อหาช่องโหว่ได้

ผลกระทบของการละเมิดความเป็นส่วนตัว

การละเมิดความเป็นส่วนตัวสามารถส่งผลที่สำคัญได้ เช่น:

  • การรั่วไหลของเนื้อหา: รายการ แผนที่ หรือฟีเจอร์ที่ยังไม่ได้เผยแพร่อาจถูกค้นพบและแชร์สาธารณะก่อนการประกาศอย่างเป็นทางการ
  • ข้อเสียในการแข่งขัน: กลยุทธ์ อัลกอริธึม หรือฟีเจอร์ที่กำลังจะมีอาจถูกวิศวกรรมย้อนกลับโดยคู่แข่งขัน
  • การพัฒนา Exploit: ลอจิกเซิร์ฟเวอร์ที่ถูกเปิดเผยทำให้สามารถระบุช่องโหว่ได้รวดเร็วและง่ายขึ้น และพัฒนาการโจมตีที่มุ่งเป้าได้
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ