Bagaimana cara melindungi mengirim skor dari game HTML5 ke server saya

13

Di backend saya menggunakan java. Saya punya game di HTML5; ketika pengguna menyelesaikannya, saya mengirim panggilan Ajax untuk menyimpan skor ke database. Sekarang, seseorang dapat dengan mudah menggunakan alat-alat seperti Fiddler dan pembakar untuk memodifikasi permintaan ajax ini dan mengirim skor yang jauh lebih baik ke server. Bagaimana cara memastikan bahwa pengguna tidak dapat memanipulasi skor!

Deepak Singhal
sumber

Jawaban:

18

Jangan hanya mengirim skor integer ke server. Kirim koleksi statistik permainan yang dapat digunakan untuk memverifikasi skor itu realistis. Atau Anda dapat menerapkan beberapa kunci yang dibagikan sebelumnya untuk menghitung skor. Anda bisa mengirim skor dan statistik tambahan di seluruh permainan dan memastikan bahwa kenaikannya masuk akal.

Namun, saya tidak akan terlalu khawatir tentang hal itu. Saran di atas akan membuatnya lebih sulit, tetapi bukan tidak mungkin untuk mengirim skor palsu. Namun, jika Anda hanya membuatnya sedikit sulit, sebagian besar orang yang memainkan permainan Anda tidak akan tertarik untuk mencoba menipu itu.

Berhati-hatilah dengan bagaimana Anda mengizinkan gim Anda berkomunikasi dengan server Anda. Anda tidak ingin game Anda menjadi titik masuk ke server Anda untuk peretasan. Pastikan Anda selalu memvalidasi input Anda dan tidak pernah mempercayai klien.

MichaelHouse
sumber
6
Lihat programmers.stackexchange.com/questions/150127/… dan gamedev.stackexchange.com/questions/37392/… untuk melengkapi dengan "Never trust the client"
dievardump
@ Byte56 tidak ada bentuk kebingungan atau enkripsi yang akan melindungi kode Anda dari debugger yang digunakan untuk memodifikasi data game saat bermain. Jika gameplay terjadi pada klien, pada dasarnya tidak mungkin untuk mencegah bentuk kecurangan ini. Browser yang mendukung Javascript bukan perangkat komputasi tepercaya.
MarkR
10

Seperti yang dikatakan Byte56: "jangan pernah mempercayai klien", tetapi:

Jangan pernah mempercayai klien datang dengan harga:
Memiliki semua game yang dimainkan di server akan meningkatkan biaya infrastruktur Anda banyak.

Dengan asumsi sebagian besar pemain tidak akan menyontek
dan skor tertinggi akan diselesaikan setelah beberapa saat dan berhenti banyak berubah

ada jalan tengah.

Rekam game (di klien).
(Tergantung pada jenis gim yang mungkin super mudah (mis. Catur) atau sedikit rumit (misalnya FPS multipemain),
tetapi selalu bisa dilakukan.)

Ketika seorang pemain menyelesaikan permainan, cukup kirimkan skor.
Jika skor berada dalam kisaran tertentu di atas (mis. 1% atau 5 teratas),
minta data yang direkam dari pemain
dan ulangi permainan itu di server.
Jika skor cocok, terima skor.

Dengan cara ini Anda tidak memerlukan sumber daya sisi server tambahan untuk sebagian besar permainan,
tetapi dapat memastikan skor teratas valid.

Andreas
sumber
2
Dengan kata lain, siapa yang peduli jika mereka menipu untuk apa pun selain skor teratas (mengapa mereka tetap melakukannya?) Jadi hanya itu yang perlu Anda validasi.
jhocking
4

Jangan khawatir tentang hal itu; melindungi dari semua serangan pada dasarnya tidak mungkin jika Anda mempercayai klien. Jika tidak ada yang menggunakan Fiddler dll, untuk memodifikasi permintaan AJAX, mereka dapat menjalankan JS debugger dan memodifikasi data gim Anda untuk memberi mereka 1000 kehidupan, dll, atau memodifikasi kode Anda, atau melakukan 100 hal lain yang belum Anda pikirkan.

Saya menulis permainan seperti itu beberapa tahun yang lalu, dan sejauh yang saya tahu, tidak ada yang menipu dengan cara ini. Tidak ada hadiah, kecuali memiliki nama Anda di tabel skor.

MarkR
sumber
4

Kurangi motivasi sosial untuk berbuat curang dengan menggunakan papan peringkat sosial (menipu hanya membuat Anda terlihat baik di segelintir teman, itu tidak merusaknya untuk semua orang).

Verifikasi di server. Joel Poloney memiliki artikel teknik yang baik di Game Developer 2012 September "Scale Your Online Game"

Vincent Scheib
sumber
2

Saat Anda ingin membuat game online yang anti-cheat, Anda harus menangani semua logika game di server. Segala sesuatu yang terjadi di sisi klien dapat dikontrol dan dimanipulasi oleh pengguna. Ada teknik seperti enkripsi atau kebingungan yang bisa Anda coba, tetapi pada akhirnya itu semua hanya keamanan melalui ketidakjelasan yang dapat dielakkan oleh seseorang yang cukup ditentukan.

Memang, gim yang berjalan di server jauh lebih rumit untuk dikembangkan, membutuhkan lebih banyak sumber daya di sisi server dan latensi jaringan merugikan pengalaman gim (terutama untuk gim yang bergerak cepat), tetapi itu satu-satunya cara untuk secara efektif mencegah pemain dari kecurangan.

Philipp
sumber
Bahkan itu tidak akan mencegah semua kecurangan - hanya hal-hal yang jelas "ya, aku sah-sah saja mendapat bazillion poin". Karena sesuatu harus dijalankan pada klien, mereka berakhir dengan kontrol apa pun. Paling tidak, klien mana pun - terutama browser web - dapat skrip.
cHao