นี่เป็นปัญหาคลาสสิกกับเกมอินเทอร์เน็ตและการแข่งขัน รหัส Flash ของคุณทำงานร่วมกับผู้ใช้เพื่อตัดสินคะแนนสำหรับเกม แต่ผู้ใช้ไม่น่าเชื่อถือและรหัส Flash ทำงานบนคอมพิวเตอร์ของผู้ใช้ คุณคือ SOL ไม่มีสิ่งใดที่คุณสามารถทำได้เพื่อป้องกันผู้โจมตีจากการปลอมแปลงคะแนนสูง:
Flash เป็นวิธีที่ง่ายกว่าในการทำวิศวกรรมย้อนกลับมากกว่าที่คุณคิดว่าเป็นเพราะไบต์เป็นเอกสารที่ดีและอธิบายภาษาระดับสูง (Actionscript) --- เมื่อคุณเผยแพร่เกม Flash คุณจะเผยแพร่ซอร์สโค้ดไม่ว่าคุณจะ รู้หรือไม่
ผู้โจมตีควบคุมหน่วยความจำรันไทม์ของล่าม Flash เพื่อให้ทุกคนที่รู้วิธีใช้ดีบักเกอร์ที่ตั้งโปรแกรมได้สามารถแก้ไขตัวแปรใด ๆ (รวมถึงคะแนนปัจจุบัน) ได้ตลอดเวลาหรือแก้ไขโปรแกรมเอง
การโจมตีระบบของคุณที่ง่ายที่สุดคือการใช้ทราฟฟิก HTTP สำหรับเกมผ่านทางพร็อกซีจับการบันทึกคะแนนสูงและเล่นซ้ำด้วยคะแนนที่สูงขึ้น
คุณสามารถลองบล็อกการโจมตีนี้โดยผูกคะแนนสูงแต่ละรายการไว้ในอินสแตนซ์เดียวของเกมตัวอย่างเช่นโดยส่งโทเค็นที่เข้ารหัสไปยังไคลเอนต์เมื่อเริ่มเกมซึ่งอาจมีลักษณะดังนี้:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(คุณสามารถใช้คุกกี้เซสชันเพื่อให้มีผลเหมือนกัน)
รหัสเกมสะท้อนโทเค็นนี้กลับไปที่เซิร์ฟเวอร์ด้วยการบันทึกคะแนนสูง แต่ผู้โจมตีสามารถเปิดเกมได้อีกครั้งรับโทเค็นแล้ววางโทเค็นนั้นลงในบันทึกคะแนนสูงที่เล่นซ้ำทันที
ถัดไปคุณจะป้อนไม่เพียงโทเค็นหรือคุกกี้เซสชันเท่านั้น แต่ยังมีคีย์เซสชันที่เข้ารหัสลับได้คะแนนสูงอีกด้วย นี่จะเป็นคีย์ AES ขนาด 128 บิตซึ่งเข้ารหัสด้วยคีย์ hardcoded ในเกม Flash
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
ตอนนี้ก่อนที่เกมจะโพสต์คะแนนสูงมันจะถอดรหัสคีย์การเข้ารหัสลับคะแนนสูงซึ่งสามารถทำได้เพราะคุณเข้ารหัสคีย์ที่เข้ารหัสลับคะแนนสูงเซสชันลงในแฟลชไบนารี่ คุณเข้ารหัสคะแนนสูงด้วยคีย์ถอดรหัสนี้พร้อมกับแฮช SHA1 ของคะแนนสูง:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
รหัส PHP บนเซิร์ฟเวอร์จะตรวจสอบโทเค็นเพื่อให้แน่ใจว่าคำขอมาจากอินสแตนซ์ของเกมที่ถูกต้องแล้วถอดรหัสคะแนนสูงที่เข้ารหัสแล้วตรวจสอบเพื่อให้แน่ใจว่าคะแนนสูงตรงกับ SHA1 ของคะแนนสูง (ถ้าคุณข้ามขั้นตอนนี้ การถอดรหัสจะสร้างแบบสุ่มมีแนวโน้มสูงมากและมีคะแนนสูง)
ดังนั้นตอนนี้ผู้โจมตีถอดรหัสรหัส Flash ของคุณและค้นหารหัส AES อย่างรวดเร็วซึ่งดึงออกมาเหมือนนิ้วโป้งถึงแม้ว่ามันจะไม่ถูกติดตามลงใน 15 นาทีด้วยการค้นหาหน่วยความจำและการติดตาม ("ฉันรู้ คะแนนของฉันสำหรับเกมนี้คือ 666 ดังนั้นลองหา 666 ในหน่วยความจำแล้วจับการดำเนินการใด ๆ ที่แตะค่า --- ดูสิรหัสการเข้ารหัสคะแนนสูง! ") ด้วยคีย์เซสชันผู้โจมตีไม่จำเป็นต้องเรียกใช้รหัส Flash เธอคว้าโทเค็นการเปิดตัวเกมและคีย์เซสชันและสามารถส่งคะแนนสูงตามอำเภอใจกลับมาได้
คุณมาถึงจุดที่นักพัฒนาซอฟต์แวร์ส่วนใหญ่ยอมแพ้ --- ยอมแพ้หรือใช้เวลาสองสามเดือนในการยุ่งกับผู้โจมตีโดย:
การไขกุญแจ AES ด้วยการดำเนินการ XOR
การแทนที่อาร์เรย์ไบต์สำคัญด้วยฟังก์ชันที่คำนวณคีย์
การกระจายการเข้ารหัสคีย์ปลอมและการโพสต์คะแนนสูงตลอดทั้งไบนารี
ทั้งหมดนี้ส่วนใหญ่เสียเวลา มันไปโดยไม่บอกว่า SSL จะไม่ช่วยคุณเช่นกัน SSL ไม่สามารถปกป้องคุณได้เมื่อหนึ่งในสองปลายทาง SSL นั้นเป็นสิ่งที่ไม่ดี
นี่คือบางสิ่งที่สามารถลดการฉ้อโกงคะแนนสูงได้จริง:
ต้องเข้าสู่ระบบเพื่อเล่นเกมมีการเข้าสู่ระบบสร้างคุกกี้เซสชันและไม่อนุญาตให้มีการเปิดตัวเกมที่โดดเด่นหลายครั้งในเซสชันเดียวกันหรือหลายเซสชันพร้อมกันสำหรับผู้ใช้เดียวกัน
ปฏิเสธคะแนนสูงจากเซสชันเกมที่น้อยกว่าเกมจริงที่สั้นที่สุดเท่าที่เคยเล่นมา (สำหรับวิธีการที่ซับซ้อนยิ่งขึ้นลอง "กักกัน" คะแนนสูงสำหรับเซสชันเกมที่มีอายุน้อยกว่า 2 ส่วนเบี่ยงเบนมาตรฐานต่ำกว่าระยะเวลาเฉลี่ยของเกม) ตรวจสอบให้แน่ใจว่าคุณกำลังติดตามเซิร์ฟเวอร์ระยะเวลาเกม
ปฏิเสธหรือกักกันคะแนนสูงจากการเข้าสู่ระบบที่เล่นเกมเพียงครั้งเดียวหรือสองครั้งดังนั้นผู้โจมตีจะต้องสร้าง "เส้นทางกระดาษ" ของการเล่นเกมที่ดูสมเหตุสมผลสำหรับการเข้าสู่ระบบแต่ละครั้งที่พวกเขาสร้าง
คะแนน "Heartbeat" ในระหว่างการเล่นเกมเพื่อให้เซิร์ฟเวอร์ของคุณเห็นการเติบโตของคะแนนตลอดช่วงเวลาของการเล่นเกมหนึ่งครั้ง ปฏิเสธคะแนนสูงที่ไม่เป็นไปตามส่วนโค้งของคะแนนที่สมเหตุสมผล (เช่นกระโดดจาก 0 ถึง 999999)
สถานะของเกม "Snapshot" ระหว่างการเล่นเกม (ตัวอย่างเช่นจำนวนกระสุนตำแหน่งในระดับ ฯลฯ ) ซึ่งคุณสามารถกระทบยอดในภายหลังกับคะแนนระหว่างกาลที่บันทึกไว้ คุณไม่จำเป็นต้องมีวิธีการตรวจจับความผิดปกติในข้อมูลนี้เพื่อเริ่มต้นด้วย คุณเพียงแค่ต้องรวบรวมมันจากนั้นคุณสามารถย้อนกลับไปและวิเคราะห์มันหากสิ่งต่าง ๆ ดูคาว
ปิดใช้งานบัญชีของผู้ใช้ที่ไม่ผ่านการตรวจสอบความปลอดภัยของคุณ (ตัวอย่างเช่นโดยการส่งคะแนนสูงที่เข้ารหัสซึ่งไม่ผ่านการตรวจสอบ)
โปรดจำไว้ว่าคุณจะยับยั้งการโกงคะแนนสูงได้ที่นี่ มีอะไรที่คุณสามารถทำได้เพื่อป้องกันไม่ให้ถ้า หากมีเงินในบรรทัดในเกมของคุณใครบางคนกำลังจะเอาชนะระบบใด ๆ ที่คุณเกิดขึ้น เป้าหมายไม่ใช่เพื่อหยุดการโจมตีนี้ มันจะทำให้การโจมตีมีราคาแพงกว่าการทำตัวเก่ง ๆ ในเกมและเอาชนะมัน