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