Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
RMMV แนวคิดการป้องกันการโกงและการขโมยข้อมูลของเกมออนไลน์ (เอนจิ้นอื่นก็มาร่วมแชร์กันได้นะ)
#1
ตอนนี้เกมยังไม่เสร็จนะครับ /แมวตาย1 แต่อยากมาแชร์ไอเดียกันคร่าวๆ สำหรับท่านที่สนใจ
ทำเกมออนไลน์ด้วย RMMV และ Nodejs (ไม่ต้อง RMMV ก็ได้ Engine อื่นก็สามารถร่วมแชร์หลักการได้ครับ)


จุดประสงค์ของกระทู้
1. เพื่อแลกเปลี่ยนไอเดียในรักษาความปลอดภัยของข้อมูลและป้องกันการโกงเกมในเกมออนไลน์
2. ชี้ให้เห็นช่องโหว่ที่อาจเกิดขึ้นกับเกมออนไลน์ที่พัฒนาด้วย RMMV

ก่อนอื่นต้องออกตัวกก่อนนะครับว่า ผมไม่ได้มีความรู้ความเชี่ยวชาญอะไรขนาดนั้น แค่มาแลกเปลี่ยนความรู้กับทุกท่านในบอร์ดในระหว่างที่กำลังพัฒนาเกมเท่านั้นเองครับ


ฝั่ง Client
Client คือผลผลิตที่ได้จาก RMMV (ก็คือตัวเกมที่เราสร้างนั้นเอง) ซึ่งต้องบอกก่อนเลยว่า แม้จะทำออกมาเป็นตัว .exe เราก็ไม่สามารถปกปิดข้อมูลใดๆบน Client ได้เลยครับ ซึ่งสาเหตุก็มาจาก

1.ไฟล์ในโฟลเดอร์ Data ของ RMMV ทั้งหมด เก็บในรูป JSON
[Image: net_00.jpg]
ไม่ใช่แค่เฉพาะ map แต่ทุกไฟล์ในโฟลเดอร์ Data มีลักษณะเดียวกันนี้ ซึ่งต่างจาก RM รุ่นก่อนๆ ที่ข้อมูลจะถูกทำให้เป็น Byte Code ในไฟล์ rxdata ดังนั้นไม่ว่าเราจะเขียน code JavaScript ไว้ในไฟล์ .js หรือแทรกโค้ดไว้ใน event มันก็ไม่สามารถป้องกันความอยากรู้อยากเห็นของคนบางกลุ่มได้ /หลอน

วิธีการ: ขั้นแรกเราต้องพยายามควบคุมสภาพแวดล้อมของเกมให้ไกลจากมือของคนกลุ่มนั้นมากสุด วิธีการหนึ่งที่ผมคิดคือให้เกมเก็บอยู่บน Host ของเราและให้ผู้เล่นเล่นผ่าน browser แทน เหตุที่ทำอย่างนี้คือลดความเสี่ยงจากการแก้ไขตัวเกมมากที่สุด (ถ้าทำเป็น .exe ก็แกะกันเพลินเลย /ยุๆๆ) แน่นอนว่าอยู่บนเว็บก็อาจจะโดนโหลดมาแกะได้อยู่ดี แต่จะสามารถเอาเกมที่แกะมาเล่นได้หรือไม่นั้นอีกเรื่องหนึ่ง Kira Smile (เพราะ server จะตรวจสอบว่าคำสั่งที่ส่งนั้นมาจากไหน ถ้าไม่ได้มีต้นตอมาจาก Host ก็อย่างที่รู้กัน /gustamucho)



2.เมื่อเรากำหนดให้เกมต้องมารันในสภาพแวดล้อมของ browser แล้ว (สำหรับ RMMV จะรองรับ Google Chrome กับ Safari เป็นหลัก ซึ่งเป็น browser ที่ใช้ Webkit Engine นั่นเอง) มันยังมีปัญหาสำหรับอย่างหนึ่ง นั่นคือ JavaScript Injection นั่นเอง เป็นความพยายามของคนบางกลุ่มที่พยายามจะ "แทรก" JavaScript code แฝงเข้าไปในตัวเกมที่รันอยู่บน browser หนึ่งในวิธีการที่ง่ายที่สุด คือ เปิดเว็บไซต์ที่เราต้องการ เช่น irpg.in.th (ไม่ได้ชี้โพรงให้กระรอกนะครับ /gustamucho) จากนั้นลองคำสั่งง่ายๆ อย่าง javascript:alert(document.cookie); ให้พิมพ์ลงในช่องที่กรอก url แล้วกด enter จะมีหน้าต่างแสดง cookie ทั้งหมดที่ในเว็บนี้ที่มี ณ ขณะนี้ (ข้อมูลของเราเองนั่นแหละ ทำหน้าเหยาหมิง)

[Image: net_01.jpg]

[Image: net_02.jpg]

ที่ผมต้องการจะบอกก็คือเราสามารถแทรกโค้ด JavaScript ใดๆลงไปก็ได้ครับ (ซึ่งรวมถึงการเรียกใช้ฟังก์ชันในเกมด้วย /แมวตาย2) ซึ่งเราจะต้องหาทางป้องกันตรงส่วนนี้

วิธีการ: เราจะต้องย้ายส่วนที่ประมวลผลต่างๆมาอยู่ที่ฝั่ง server เกือบทั้งหมด เช่นเมื่อผู้เล่นกดซื้อไอเทมจะส่งคำสั่งไปที่ server ให้ลดค่าตัวแปรที่ server แทนที่จะจัดการตั้งแต่ที่ client จริงอยู่ที่อาจจะเพิ่มภาระให้กับ server แต่ก็เป็นวิธีการที่ช่วยป้องกันการโกงเกมทางหนึ่ง

นอกจากนี้การ tracking สิ่งต่างๆที่ผู้เล่นได้ทำเพื่อหาความสมเหตุสมผลของการส่งคำสั่งก็เป็นอีกอย่างที่สำคัญมาก เช่น คงไม่มีทางที่อยู่ๆผู้เล่นซื้อของเสร็จแล้วเงินเพิ่มทันที โดยไม่ได้ไปล่ามอน เทรดเงินกับผู้เล่นอื่น หรือกดเติมเงินเป็นต้น

ฝั่ง client หลักๆมีเพียงเท่านี้ ถ้ามีเพิ่มจะมาอ้างถึงในภายหลังครับ หากท่านใดจะร่วมแชร์ความรู้ก็ยินดีเลยครับ แมวเบิกบาน


ฝั่ง Server
Server ใช้ Nodejs ในการพัฒนา ซึ่งก็เป็น JavaScript อีกนั่นแหละ มีเรื่องที่ต้องระวังเยอะเลย เช่น Express Injection และอื่นๆ ซึ่งหลายอย่างผมยังไม่ได้ศึกษามาดีทีเลยไม่ขอพูดถึงก่อน

1. ผู้ใช้ยิงคำสั่งมาที่ Server รัวๆ ซึ่งจะส่งผลให้เซิฟล่ม

วิธีการ: มีหลายวิธีเช่นการจำกัดความถี่ในการส่งข้อมูลสูงสุด อาจใช้การหาเวลาในการส่งล่าสุด เป็นต้น อย่างไรก็ตาม ถ้าผู้เล่นจงใจยิงคำสั่งมารัวๆ จริง ยังไงก็ล่มล่ะครับ คงต้องป้องกันในระดับที่สูงกว่าซึ่งไม่พูดถึงตรงนี้ /กระซิก1

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

ขอบคุณที่สละเวลามาอ่าน เอ้าดื่ม
[Image: 76561198040918068.png]
[-] The following 7 users say Thank You to XthemeCore for this post:
  • arkman, dreamknight, Ivan_GilDong, Kuntana, Mysticphoenix, OngkrubG, slost
Reply
#2
;3

น่าสนใจดีครับ ผมลองไปหาวิธีป้องกัน DDOS ดู ก็เจอตัวนี้เข้าครับ

https://www.npmjs.com/package/ddos

หวังว่าจะเป็นประโยชน์ Derp
May the flames guide your way. Every ending will make you stronger.

[Image: v1.png]
Reply
#3
ถ้าพูดแบบกำปั้นทุบดินคือเขียน Scope ของแต่ละฟังก์ชันให้ดีครับ (ซึ่งยาก ผมก็หลงบ่อยๆ) จะสามารถป้องกันการ inject โค๊ดได้เยอะเลย

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

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

ทางเซิร์ฟเวอร์จากในกระทู้ผมเดาว่าคุณใช้ Express ซึ่งเชื่อมกับ Client ผ่าน REST API ซึ่งถ้าข้อมูลไม่มาก ผู้ใช้ไม่มาก มันก็พอทำงานได้ แต่ถ้าผู้ใช้เยอะๆขึ้นมานี่พังครับ เพราะจะเกิด HTTP Overhead จำนวนมาก และเสียความ Realtime ไป ดังนั้นตรงนี้แนะนำให้ใช้ Socket แทน (Node.js มีแพ็คเกจ Socket.io ให้เล่นครับ)
[Image: 76561198011764062.png]

[Image: graphic.png]
Reply
#4
RPG Maker สร้างเกมออนไลน์ได้ทั้งที น่าจะทำเรื่อง security ออกมาให้ดีนิดนึงเนอะ
[Image: webboard%20signature1_zpskhtut2jg.png]
การทำอาหารที่อร่อยที่สุด และเดือดร้อนชาวบ้านมากที่สุด กำลังจะเริ่มขึ้น
Reply
#5
ตัว RPG maker MV ใช้ NW.js เป็น engine ในการแสดงผล
แต่ว่าตัว RPG maker MV ดันไม่บีบไฟล์เข้าเป็น EXE เดียวซะอย่างนั้น ต้องบีบด้วยตัวเอง
ลองทำตาม https://github.com/nwjs/nw.js/wiki/how-t...-your-apps ดูครับ

หรือไม่ก็ลอง compile ตัว source code ให้กลายเป็น .bin ดูก่อนครับ http://docs.nwjs.io/en/latest/For%20User...ce%20Code/

หวังว่าจะเป็นประโยชน์นะครับ
Personal Blog: https://www.pureapp.in.th

[Image: pureexe.png]
Reply
#6
(06-02-2016, 06:45 PM)pureexe Wrote: ตัว RPG maker MV ใช้ NW.js เป็น engine ในการแสดงผล
แต่ว่าตัว RPG maker MV ดันไม่บีบไฟล์เข้าเป็น EXE เดียวซะอย่างนั้น ต้องบีบด้วยตัวเอง
ลองทำตาม https://github.com/nwjs/nw.js/wiki/how-t...-your-apps ดูครับ

หรือไม่ก็ลอง compile ตัว source code ให้กลายเป็น .bin ดูก่อนครับ http://docs.nwjs.io/en/latest/For%20User...ce%20Code/

หวังว่าจะเป็นประโยชน์นะครับ

ดีจัย ขอบคุณครับ ในที่สุดมีคนบอกวิธีสำหรับตัว exe แล้ว (เห็นในเว็บมันบอกประสิทธิภาพจะลดลง 30% ด้วยนี่ครับ) แมวร้อง เดี๋ยวจะลองดูอีกที
[Image: 76561198040918068.png]
Reply
#7
สำหรับเซิฟเวอร์โดนยิงจนล่ม ผมมี มูมู่ (https://mumu.irin.in.th) ใช้ Node.js อยู่

[Image: 71e82575a8.png]

ผมใช้วิธีกันชั้นแรกด้วย Cloudflare ในการกัน DDOS หรือการโจมตีทางอื่นๆไว้ก่อน จากนั้นรับจำนวนผู้ใช้จำนวนมากด้วยการทำ load balance ครับ ซึ่งขั้นตอนการทำ load balance "เอง" จะค่อนข้างซับซ้อนครับ (จริงๆผมใช้ Openshift ตั้งค่าแล้วกด next รัวๆ --")

หรือถ้าขี้เกียจปวดหัวเรื่อง ระบบหลังบ้านครับ แนะนำ Backend-as-a-service (BaaS)
ถ้ายังไม่มีเซิฟเวอร์เป็นของตัวเองแนะนำให้ใช้ Firebase ของ Google ครับ (https://firebase.google.com)
หรือถ้ามีเซิฟเวอร์เป็ยของตัวเองแล้วแนะนำให้ใช้ parse server ของ Facebook ครับ (http://parse.com/)
Personal Blog: https://www.pureapp.in.th

[Image: pureexe.png]
Reply
#8
OpenShift เอาไว้วาง server ดีไหมครับ เห็นมันฟรี แมวเบิกบาน
[Image: 76561198040918068.png]
Reply
#9
(06-02-2016, 08:44 PM)XthemeCore Wrote: OpenShift เอาไว้วาง server ดีไหมครับ เห็นมันฟรี แมวเบิกบาน

ถามว่าดีไหม เท่าที่ใช้มาก็ไม่เจอปัญหาครับ มีปัญหาเล็กๆอย่างเดียวคือเซิฟมันอยู่ไกล แพ็คเกจฟรี บังคับใช้ AWS us-east-1 ที่อยู่เวอจิเนียเท่านั้น แลคแน่นอนสำหรับเกมส์ออนไลน์

ดังนั้นถ้าจะเอามาทำเกมส์ออนไลน์ไม่ค่อยจะดีเท่าไรครับ แต่ถ้าเกมส์ไม่ถึงกะ real time แค่เก็บคะแนนตอนเล่นผ่านด่านก็ไม่มีปัญหาครับ
Personal Blog: https://www.pureapp.in.th

[Image: pureexe.png]
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)