ก่อนที่จะดำดิ่งสู่กลยุทธ์เฉพาะเพื่อพัฒนาความปลอดภัยและป้องกันการโกง สิ่งสำคัญคือการเข้าใจหลักการพื้นฐานของความปลอดภัยใน Roblox ประสบการณ์ที่ปลอดภัยสร้างขึ้นจากแนวคิดที่คาดการณ์การกระทำที่เป็นอันตราย ก่อนที่จะเขียนโค้ดบรรทัดเดียว คุณต้องทำความเข้าใจหลักการพื้นฐานเหล่านี้ให้ชัดเจน มันควรมีอิทธิพลต่อการตัดสินใจทางสถาปัตยกรรมและการออกแบบที่คุณทำ
อย่าพึ่งพาฝ่ายลูกค้า
นี่คือหลักการพื้นฐาน ผู้ที่มีเจตนาร้ายมีการควบคุมโดยสมบูรณ์ต่อสภาวะในพื้นที่ท้องถิ่นและการจราจรเครือข่ายของตน เนื่องจากผู้ที่มีเจตนาร้ายมีระดับการควบคุมนี้ วิธีการรักษาความปลอดภัยใด ๆ ที่อิงจากการบังคับใช้งานด้านลูกค้าจะถูกหลีกเลี่ยงในที่สุด นี่ไม่ใช่ข้อจำกัดของ Roblox: แต่เป็นความจริงพื้นฐานของสถาปัตยกรรมลูกค้า-เซิร์ฟเวอร์ สมมุติว่าข้อมูลแต่ละชิ้นที่ส่งจากลูกค้าได้รับการดัดแปลง สร้างขึ้น หรือส่งด้วยเจตนาที่เป็นอันตราย ซึ่งรวมถึงความสามารถในการ:
- ถอดรหัส LocalScript ที่ถูกทำสำเนาหรือ ModuleScript ใด ๆ แม้ว่ามันจะไม่ทำงานบนฝ่ายลูกค้า
- เป็นเจ้าของเครือข่ายของตัวละครและชิ้นส่วนที่ไม่ถูกยึด
- กระตุ้นเหตุการณ์ที่เริ่มต้นจากลูกค้าเช่น เหตุการณ์ Touched หรือการเปิดใช้ ProximityPrompt ในระยะหรือความถี่ใด ๆ
- ดัดแปลงตำแหน่ง ฟิสิกส์ หรือการมีปฏิสัมพันธ์ของผู้เล่นกับโลก
- เรียกใช้หรือกระตุ้น RemoteEvents และ RemoteFunctions ในความถี่ใด ๆ ด้วยอาร์กิวเมนต์ที่กำหนดเอง (นอกจากอาร์กิวเมนต์ Player ตัวแรก)
- เปลี่ยนแปลงใด ๆ ใน DataModel ท้องถิ่นของพวกเขาโดยไม่ต้องเรียกเหตุการณ์ที่คาดหวัง
- เปลี่ยนแปลงพฤติกรรมของโค้ดที่ทำงานอยู่ในเครื่องได้อย่างไร้ขีดจำกัด
เนื่องจากเหตุผลนี้ จึงต้องมีการตรวจสอบตรรกะที่สำคัญทั้งหมดด้านเซิร์ฟเวอร์หรือทำงานเฉพาะบนเซิร์ฟเวอร์เท่านั้น ผลที่มาจากการควบคุมนี้ได้แก่ใน Network Ownership, Movement Validation, and Physics Exploits และ Access Control and Confidentiality.
อำนาจของเซิร์ฟเวอร์
เซิร์ฟเวอร์ต้องเป็นแหล่งความจริงที่สำคัญที่สุดสำหรับสถานะการจำลองทั้งหมด กฎเกณฑ์ ความก้าวหน้าของผู้เล่น และการตัดสินใจที่สำคัญ บทบาทของลูกค้าคือการเรนเดอร์โลกและส่งข้อมูลการใช้ของผู้ใช้ไปยังเซิร์ฟเวอร์
บทบาทของเซิร์ฟเวอร์คือ:
- รับข้อมูลจากฝ่ายลูกค้า
- ตรวจสอบให้แน่ใจว่าการกระทำที่ร้องขอนั้นเป็นไปได้และได้รับอนุญาต
- ดำเนินการตามการกระทำและปรับปรุงสถานะที่มีอำนาจ
- ทำสำเนาผลลัพธ์ไปยังลูกค้าที่เกี่ยวข้องทั้งหมด
ตัวอย่างเช่น หากผู้เล่นพูดว่า "ฉันต้องการซื้อ Bloxy Cola" เซิร์ฟเวอร์ต้องรู้ราคาที่แท้จริงของไอเท็ม เงินของผู้เล่น และระยะทางทางกายภาพระหว่างตัวละครของผู้เล่นกับร้านค้า ก่อนที่จะตรวจสอบและอนุมัติการทำธุรกรรม อย่างไรก็ตามเท่าที่จะทำได้ สถานะที่จะต้องตรวจสอบควรถูกดูแลโดยเซิร์ฟเวอร์เพียงอย่างเดียวและไม่ใช่โดยลูกค้า ในตัวอย่างนี้ หากการทำธุรกรรม Bloxy Cola ได้รับการอนุมัติ เซิร์ฟเวอร์ควรหักราคาของ Bloxy Cola จากเงินของผู้เล่น แต่เซิร์ฟเวอร์ไม่สามารถควบคุมตัวละครของผู้เล่นได้เสมอไป
ความปลอดภัยโดยการออกแบบ
รวมคำนึงถึงความปลอดภัยเข้าเป็นส่วนหนึ่งของการออกแบบประสบการณ์ของคุณตั้งแต่ต้น แทนที่จะพยายามเพิ่มมันเข้าไปทีหลังในภายหลัง
- แบบจำลองภัยคุกคามสำหรับฟีเจอร์ใหม่ทุกฟีเจอร์ สำหรับฟีเจอร์ใหม่แต่ละชิ้น ให้ถามว่า
- ผู้โจมตีสามารถใช้ประโยชน์จากสิ่งนี้ได้อย่างไรหากพวกเขาควบคุมฝ่ายลูกค้าโดยสมบูรณ์?
- หากลูกค้าสามารถส่งค่าใด ๆ สำหรับพารามิเตอร์ใด ๆ ที่ใช้ในฟีเจอร์ นี้ ผลที่แย่ที่สุดจะเป็นอย่างไร?
- จะเกิดอะไรขึ้นหากฟีเจอร์นี้ถูกใช้มากกว่า 1,000 ครั้งต่อวินาที? อัตราสูงสุดที่ควรใช้นั้นคือเท่าไหร่?
- ผู้ที่มีเจตนาร้ายสามารถใช้มันเพื่อทำลายประสบการณ์ของผู้เล่นอื่นได้หรือไม่?
- ทรัพยากรเท่าไหร่ในกรณีที่เลวร้ายที่สุดที่ฟีเจอร์นี้ใช้ได้จริง?
- ข้อมูลหรือสถานะภายในขั้นต่ำอะไรที่ฉันจำเป็นต้องเปิดเผยสำหรับฟีเจอร์นี้?
- แบ่งหน้าที่ออกแต่เนิ่น ๆ เก็บตรรกะและข้อมูลใน ServerScriptService ตั้งแต่วันแรก อย่าวางในคอนเทนเนอร์ที่ถูกทำสำเนาอย่าง ReplicatedStorage หรือ Workspace