05-29-2016, 09:51 PM
ตอนนี้เกมยังไม่เสร็จนะครับ แต่อยากมาแชร์ไอเดียกันคร่าวๆ สำหรับท่านที่สนใจ
ทำเกมออนไลน์ด้วย RMMV และ Nodejs (ไม่ต้อง RMMV ก็ได้ Engine อื่นก็สามารถร่วมแชร์หลักการได้ครับ)
จุดประสงค์ของกระทู้
1. เพื่อแลกเปลี่ยนไอเดียในรักษาความปลอดภัยของข้อมูลและป้องกันการโกงเกมในเกมออนไลน์
2. ชี้ให้เห็นช่องโหว่ที่อาจเกิดขึ้นกับเกมออนไลน์ที่พัฒนาด้วย RMMV
ก่อนอื่นต้องออกตัวกก่อนนะครับว่า ผมไม่ได้มีความรู้ความเชี่ยวชาญอะไรขนาดนั้น แค่มาแลกเปลี่ยนความรู้กับทุกท่านในบอร์ดในระหว่างที่กำลังพัฒนาเกมเท่านั้นเองครับ
ฝั่ง Client
Client คือผลผลิตที่ได้จาก RMMV (ก็คือตัวเกมที่เราสร้างนั้นเอง) ซึ่งต้องบอกก่อนเลยว่า แม้จะทำออกมาเป็นตัว .exe เราก็ไม่สามารถปกปิดข้อมูลใดๆบน Client ได้เลยครับ ซึ่งสาเหตุก็มาจาก
1.ไฟล์ในโฟลเดอร์ Data ของ RMMV ทั้งหมด เก็บในรูป JSON
ไม่ใช่แค่เฉพาะ map แต่ทุกไฟล์ในโฟลเดอร์ Data มีลักษณะเดียวกันนี้ ซึ่งต่างจาก RM รุ่นก่อนๆ ที่ข้อมูลจะถูกทำให้เป็น Byte Code ในไฟล์ rxdata ดังนั้นไม่ว่าเราจะเขียน code JavaScript ไว้ในไฟล์ .js หรือแทรกโค้ดไว้ใน event มันก็ไม่สามารถป้องกันความอยากรู้อยากเห็นของคนบางกลุ่มได้
วิธีการ: ขั้นแรกเราต้องพยายามควบคุมสภาพแวดล้อมของเกมให้ไกลจากมือของคนกลุ่มนั้นมากสุด วิธีการหนึ่งที่ผมคิดคือให้เกมเก็บอยู่บน Host ของเราและให้ผู้เล่นเล่นผ่าน browser แทน เหตุที่ทำอย่างนี้คือลดความเสี่ยงจากการแก้ไขตัวเกมมากที่สุด (ถ้าทำเป็น .exe ก็แกะกันเพลินเลย /ยุๆๆ) แน่นอนว่าอยู่บนเว็บก็อาจจะโดนโหลดมาแกะได้อยู่ดี แต่จะสามารถเอาเกมที่แกะมาเล่นได้หรือไม่นั้นอีกเรื่องหนึ่ง (เพราะ server จะตรวจสอบว่าคำสั่งที่ส่งนั้นมาจากไหน ถ้าไม่ได้มีต้นตอมาจาก Host ก็อย่างที่รู้กัน )
2.เมื่อเรากำหนดให้เกมต้องมารันในสภาพแวดล้อมของ browser แล้ว (สำหรับ RMMV จะรองรับ Google Chrome กับ Safari เป็นหลัก ซึ่งเป็น browser ที่ใช้ Webkit Engine นั่นเอง) มันยังมีปัญหาสำหรับอย่างหนึ่ง นั่นคือ JavaScript Injection นั่นเอง เป็นความพยายามของคนบางกลุ่มที่พยายามจะ "แทรก" JavaScript code แฝงเข้าไปในตัวเกมที่รันอยู่บน browser หนึ่งในวิธีการที่ง่ายที่สุด คือ เปิดเว็บไซต์ที่เราต้องการ เช่น irpg.in.th (ไม่ได้ชี้โพรงให้กระรอกนะครับ ) จากนั้นลองคำสั่งง่ายๆ อย่าง javascript:alert(document.cookie); ให้พิมพ์ลงในช่องที่กรอก url แล้วกด enter จะมีหน้าต่างแสดง cookie ทั้งหมดที่ในเว็บนี้ที่มี ณ ขณะนี้ (ข้อมูลของเราเองนั่นแหละ )
ที่ผมต้องการจะบอกก็คือเราสามารถแทรกโค้ด JavaScript ใดๆลงไปก็ได้ครับ (ซึ่งรวมถึงการเรียกใช้ฟังก์ชันในเกมด้วย ) ซึ่งเราจะต้องหาทางป้องกันตรงส่วนนี้
วิธีการ: เราจะต้องย้ายส่วนที่ประมวลผลต่างๆมาอยู่ที่ฝั่ง server เกือบทั้งหมด เช่นเมื่อผู้เล่นกดซื้อไอเทมจะส่งคำสั่งไปที่ server ให้ลดค่าตัวแปรที่ server แทนที่จะจัดการตั้งแต่ที่ client จริงอยู่ที่อาจจะเพิ่มภาระให้กับ server แต่ก็เป็นวิธีการที่ช่วยป้องกันการโกงเกมทางหนึ่ง
นอกจากนี้การ tracking สิ่งต่างๆที่ผู้เล่นได้ทำเพื่อหาความสมเหตุสมผลของการส่งคำสั่งก็เป็นอีกอย่างที่สำคัญมาก เช่น คงไม่มีทางที่อยู่ๆผู้เล่นซื้อของเสร็จแล้วเงินเพิ่มทันที โดยไม่ได้ไปล่ามอน เทรดเงินกับผู้เล่นอื่น หรือกดเติมเงินเป็นต้น
ฝั่ง client หลักๆมีเพียงเท่านี้ ถ้ามีเพิ่มจะมาอ้างถึงในภายหลังครับ หากท่านใดจะร่วมแชร์ความรู้ก็ยินดีเลยครับ
ฝั่ง Server
Server ใช้ Nodejs ในการพัฒนา ซึ่งก็เป็น JavaScript อีกนั่นแหละ มีเรื่องที่ต้องระวังเยอะเลย เช่น Express Injection และอื่นๆ ซึ่งหลายอย่างผมยังไม่ได้ศึกษามาดีทีเลยไม่ขอพูดถึงก่อน
1. ผู้ใช้ยิงคำสั่งมาที่ Server รัวๆ ซึ่งจะส่งผลให้เซิฟล่ม
วิธีการ: มีหลายวิธีเช่นการจำกัดความถี่ในการส่งข้อมูลสูงสุด อาจใช้การหาเวลาในการส่งล่าสุด เป็นต้น อย่างไรก็ตาม ถ้าผู้เล่นจงใจยิงคำสั่งมารัวๆ จริง ยังไงก็ล่มล่ะครับ คงต้องป้องกันในระดับที่สูงกว่าซึ่งไม่พูดถึงตรงนี้
นี่ก็คือคร่าวๆเกี่ยวกับการป้องกันข้อมูลของเกมออนไลน์ที่พัฒนาด้วย RMMV ครับ
ถ้าท่านใดจะท้วงติง หรือเสนอแนะใดๆ ก็พร้อมกับการพิจารณนาครับ
ขอบคุณที่สละเวลามาอ่าน
ทำเกมออนไลน์ด้วย RMMV และ Nodejs (ไม่ต้อง RMMV ก็ได้ Engine อื่นก็สามารถร่วมแชร์หลักการได้ครับ)
จุดประสงค์ของกระทู้
1. เพื่อแลกเปลี่ยนไอเดียในรักษาความปลอดภัยของข้อมูลและป้องกันการโกงเกมในเกมออนไลน์
2. ชี้ให้เห็นช่องโหว่ที่อาจเกิดขึ้นกับเกมออนไลน์ที่พัฒนาด้วย RMMV
ก่อนอื่นต้องออกตัวกก่อนนะครับว่า ผมไม่ได้มีความรู้ความเชี่ยวชาญอะไรขนาดนั้น แค่มาแลกเปลี่ยนความรู้กับทุกท่านในบอร์ดในระหว่างที่กำลังพัฒนาเกมเท่านั้นเองครับ
ฝั่ง Client
Client คือผลผลิตที่ได้จาก RMMV (ก็คือตัวเกมที่เราสร้างนั้นเอง) ซึ่งต้องบอกก่อนเลยว่า แม้จะทำออกมาเป็นตัว .exe เราก็ไม่สามารถปกปิดข้อมูลใดๆบน Client ได้เลยครับ ซึ่งสาเหตุก็มาจาก
1.ไฟล์ในโฟลเดอร์ Data ของ RMMV ทั้งหมด เก็บในรูป JSON
ไม่ใช่แค่เฉพาะ map แต่ทุกไฟล์ในโฟลเดอร์ Data มีลักษณะเดียวกันนี้ ซึ่งต่างจาก RM รุ่นก่อนๆ ที่ข้อมูลจะถูกทำให้เป็น Byte Code ในไฟล์ rxdata ดังนั้นไม่ว่าเราจะเขียน code JavaScript ไว้ในไฟล์ .js หรือแทรกโค้ดไว้ใน event มันก็ไม่สามารถป้องกันความอยากรู้อยากเห็นของคนบางกลุ่มได้
วิธีการ: ขั้นแรกเราต้องพยายามควบคุมสภาพแวดล้อมของเกมให้ไกลจากมือของคนกลุ่มนั้นมากสุด วิธีการหนึ่งที่ผมคิดคือให้เกมเก็บอยู่บน Host ของเราและให้ผู้เล่นเล่นผ่าน browser แทน เหตุที่ทำอย่างนี้คือลดความเสี่ยงจากการแก้ไขตัวเกมมากที่สุด (ถ้าทำเป็น .exe ก็แกะกันเพลินเลย /ยุๆๆ) แน่นอนว่าอยู่บนเว็บก็อาจจะโดนโหลดมาแกะได้อยู่ดี แต่จะสามารถเอาเกมที่แกะมาเล่นได้หรือไม่นั้นอีกเรื่องหนึ่ง (เพราะ server จะตรวจสอบว่าคำสั่งที่ส่งนั้นมาจากไหน ถ้าไม่ได้มีต้นตอมาจาก Host ก็อย่างที่รู้กัน )
2.เมื่อเรากำหนดให้เกมต้องมารันในสภาพแวดล้อมของ browser แล้ว (สำหรับ RMMV จะรองรับ Google Chrome กับ Safari เป็นหลัก ซึ่งเป็น browser ที่ใช้ Webkit Engine นั่นเอง) มันยังมีปัญหาสำหรับอย่างหนึ่ง นั่นคือ JavaScript Injection นั่นเอง เป็นความพยายามของคนบางกลุ่มที่พยายามจะ "แทรก" JavaScript code แฝงเข้าไปในตัวเกมที่รันอยู่บน browser หนึ่งในวิธีการที่ง่ายที่สุด คือ เปิดเว็บไซต์ที่เราต้องการ เช่น irpg.in.th (ไม่ได้ชี้โพรงให้กระรอกนะครับ ) จากนั้นลองคำสั่งง่ายๆ อย่าง javascript:alert(document.cookie); ให้พิมพ์ลงในช่องที่กรอก url แล้วกด enter จะมีหน้าต่างแสดง cookie ทั้งหมดที่ในเว็บนี้ที่มี ณ ขณะนี้ (ข้อมูลของเราเองนั่นแหละ )
ที่ผมต้องการจะบอกก็คือเราสามารถแทรกโค้ด JavaScript ใดๆลงไปก็ได้ครับ (ซึ่งรวมถึงการเรียกใช้ฟังก์ชันในเกมด้วย ) ซึ่งเราจะต้องหาทางป้องกันตรงส่วนนี้
วิธีการ: เราจะต้องย้ายส่วนที่ประมวลผลต่างๆมาอยู่ที่ฝั่ง server เกือบทั้งหมด เช่นเมื่อผู้เล่นกดซื้อไอเทมจะส่งคำสั่งไปที่ server ให้ลดค่าตัวแปรที่ server แทนที่จะจัดการตั้งแต่ที่ client จริงอยู่ที่อาจจะเพิ่มภาระให้กับ server แต่ก็เป็นวิธีการที่ช่วยป้องกันการโกงเกมทางหนึ่ง
นอกจากนี้การ tracking สิ่งต่างๆที่ผู้เล่นได้ทำเพื่อหาความสมเหตุสมผลของการส่งคำสั่งก็เป็นอีกอย่างที่สำคัญมาก เช่น คงไม่มีทางที่อยู่ๆผู้เล่นซื้อของเสร็จแล้วเงินเพิ่มทันที โดยไม่ได้ไปล่ามอน เทรดเงินกับผู้เล่นอื่น หรือกดเติมเงินเป็นต้น
ฝั่ง client หลักๆมีเพียงเท่านี้ ถ้ามีเพิ่มจะมาอ้างถึงในภายหลังครับ หากท่านใดจะร่วมแชร์ความรู้ก็ยินดีเลยครับ
ฝั่ง Server
Server ใช้ Nodejs ในการพัฒนา ซึ่งก็เป็น JavaScript อีกนั่นแหละ มีเรื่องที่ต้องระวังเยอะเลย เช่น Express Injection และอื่นๆ ซึ่งหลายอย่างผมยังไม่ได้ศึกษามาดีทีเลยไม่ขอพูดถึงก่อน
1. ผู้ใช้ยิงคำสั่งมาที่ Server รัวๆ ซึ่งจะส่งผลให้เซิฟล่ม
วิธีการ: มีหลายวิธีเช่นการจำกัดความถี่ในการส่งข้อมูลสูงสุด อาจใช้การหาเวลาในการส่งล่าสุด เป็นต้น อย่างไรก็ตาม ถ้าผู้เล่นจงใจยิงคำสั่งมารัวๆ จริง ยังไงก็ล่มล่ะครับ คงต้องป้องกันในระดับที่สูงกว่าซึ่งไม่พูดถึงตรงนี้
นี่ก็คือคร่าวๆเกี่ยวกับการป้องกันข้อมูลของเกมออนไลน์ที่พัฒนาด้วย RMMV ครับ
ถ้าท่านใดจะท้วงติง หรือเสนอแนะใดๆ ก็พร้อมกับการพิจารณนาครับ
ขอบคุณที่สละเวลามาอ่าน