Anti-cheat Javascript untuk game browser / HTML5


35

Saya berencana menjelajah membuat aksi pemain tunggal rpg di js / html5, dan saya ingin mencegah kecurangan. Saya tidak membutuhkan perlindungan 100%, karena ini tidak akan menjadi permainan multipemain, tetapi saya ingin beberapa tingkat perlindungan.

Jadi strategi apa yang Anda sarankan di luar minify dan kebingungan?

Saya tidak akan repot-repot membuat pengecekan sisi server sederhana, tapi saya tidak ingin mengikuti jalur Diablo 3 menjaga semua perubahan kondisi permainan saya di sisi server.

Karena ini akan menjadi semacam rpg saya datang dengan ide membuat inspektur statistik yang memeriksa perubahan tiba-tiba dalam nilai-nilai mereka, tapi saya tidak yakin bagaimana itu konsisten dan dapat dipercaya itu bisa.

Bagaimana dengan variabel dan fungsi eskop? Bekerja pada eskop yang lebih kecil jika mungkin lebih aman, tetapi sepadan dengan usaha?

Apakah ada javascript untuk memeriksa sendiri teksnya, seperti dalam checksum?

Ada solusi khusus browser? Saya tidak akan repot-repot menahannya untuk Chrome hanya di build awal.


Di mana data Anda disimpan, bagaimana data Anda disimpan?
DogDog

Lucu Anda berbicara tentang Diable 3, "Diablo 1 way" persis seperti itu, mempercayai klien. Lakukan pencarian google jika Anda terlalu muda untuk mengingat apa yang terjadi karena itu!
Valmond


Apoc, saat ini saya hanya memiliki bukti konsep dan saya belum menerapkan kegigihan apa pun - tetapi saya berencana untuk menerapkan beberapa ketekunan DB dalam pembuatan pertama dan / atau penyimpanan lokal sehingga pemain tidak bisa terus bermain dari tempat mereka pergi. Ya, Valdmond saya memainkan bagian saya dari Diablo saat itu. Tapi saya tidak membangun game multipemain yang kompetitif, atau AAA yang ditandai penuh. Byte56, saya tidak khawatir mencuri kode saya (siapa yang mau omong kosong itu?)
Billy Ninja

sayangnya, Anda harus menempuh jalan diablo 3, jika Anda benar-benar khawatir tentang peretasan / cheat
Pengembang Game Noob

Jawaban:


46

Jawaban singkatnya adalah Anda tidak bisa melakukannya. Apa pun yang menjalankan sisi klien, terutama dari sumber, dapat dimodifikasi untuk mengalahkan taktik Anda secara sepele. Jika Anda menempatkan pemeriksa sisi klien untuk mencari perubahan mendadak, pengguna hanya dapat menonaktifkan pemeriksa.

Berita baiknya adalah, pada umumnya, ada sedikit kecurangan pada permainan pemain tunggal. Satu-satunya pengecualian utama adalah untuk game yang memiliki komunitas "youtube highscore" besar seperti Line Rider, di mana para pemain saling bersaing melalui YouTube.

Jika Anda bertujuan untuk itu, atau terlalu keras kepala untuk menerima bahwa orang mungkin curang dalam permainan, atau menjaga skor tinggi Anda sendiri (yang merupakan bentuk multiplayer) maka yang harus Anda lakukan adalah semua perhitungan di sisi server . Ya, semua yang penting. Anda bahkan tidak dapat mengulangi sisi perhitungan klien untuk mencoba memberikan skor kepada pengguna dan kemudian 'memverifikasi' dengan server karena pengguna kemudian dapat menonaktifkan centang dan menonaktifkan sistem yang memastikan ada pemeriksaan.

Saya berharap ada jawaban yang lebih baik untuk ini, tetapi tidak ada.

Yang mengatakan, ada hal-hal yang dapat Anda lakukan untuk membuatnya sedikit lebih sulit untuk menipu. Mereka tidak akan menghentikan siapa pun yang serius melakukannya dan melepaskan toolkit untuk menipu, tetapi itu akan memperlambat mereka:

  • Perkecil dan Perkecil JS Anda, yang tentunya akan membuat kode lebih sulit dibaca. Anda dapat menghapus dan memilah-milah, tetapi Anda tidak akan pernah bisa mendapatkan kembali variabel dan nama fungsi yang tepat, atau komentar.
  • Panggang nilai dengan bahasa yang berbeda. Dalam hal ini Anda dapat menggunakan PHP atau bahasa sisi server lain untuk menangani variabel pengaturan statis. Jika jarak lompatan selalu dianggap 2 spasi, biasanya Anda akan menentukan jarak lompatan untuk objek pemain. Jangan, atasi itu dengan PHP sehingga sumber JS berakhir dengan 2s terpampang di seluruh kode di sejuta tempat. Ini memiliki efek samping tambahan yang menyenangkan karena dapat mempercepat JS Anda juga.
  • Dengan beberapa latihan, Anda akan menjadi mahir dengan campuran dan Anda bahkan dapat membuat kustom JS Anda untuk setiap pemain. Yang merupakan cara lain untuk mencegah kecurangan. Jika kode setiap pemain berbeda, maka lebih sulit untuk menulis cheat yang bisa menjadi bagian dari toolkit.
  • Akhirnya, Anda dapat memeriksa sumber berdasarkan identitas pemain. Ucapkan alamat IP dan / atau nama pengguna mereka. Anda tahu apa versi JS khusus pemain, Anda dapat membuat checksum dan mengharuskannya sama di ujung yang lain. Mudah dinonaktifkan seperti JS sisi klien, tetapi sekali lagi membuatnya sedikit lebih sulit untuk membuat toolkit.

Begitu. Seperti yang Anda lihat, mungkin tidak layak untuk menempuh rute ini. Itu susah. Membutuhkan banyak praktik pengkodean yang benar-benar konyol untuk dilakukan, dan pada akhirnya masih relatif mudah dikalahkan. Anda harus melakukan semua sisi server perhitungan untuk mencegah kecurangan. Atau lepaskan, dan terimalah kecurangan itu akan terjadi.


Contoh line rider sebenarnya cukup sepele untuk dilakukan di sisi server, dengan membiarkan pengguna mengunggah peta yang telah digambar dan menghitung skor. Tapi gim seperti arcade tidak mungkin menghitung skor sisi server tanpa kerja keras.
orlp

@nightcracker Anda benar, namun bahkan dengan sesuatu seperti Line Rider, jika Anda hanya memeriksa setelah permainan selesai, video telah dibuat dan YouTubes sudah ditipu. Anda harus mengunggah peta saat pengguna menekan tombol play, menghitung jalur yang sepele, dan kemudian mengirimkannya kembali. Gim seharusnya tidak mampu menghitung jalan. (Jika kita berbicara tentang membuatnya menjadi bukti pembohong, yang mana bukan game itu. Cukup sederhana bahwa menyontek sudah jelas bagi para penggemarnya.)
DampeS8N

14

Saya sudah menjawab pertanyaan seperti itu di sini , dan saya minta maaf untuk mengatakan tetapi:

Saya tidak akan repot-repot membuat pengecekan sisi server sederhana, tapi saya tidak ingin mengikuti jalur Diablo 3 menjaga semua perubahan kondisi permainan saya di sisi server.

Adalah hal terburuk yang bisa Anda katakan di sini. Jika Anda ingin melakukan mesin "anti-cheat", Anda harus melakukannya. Anda dapat menambahkan apa pun yang Anda inginkan di sisi klien, untuk memudahkan pekerjaan di sisi server, tetapi Anda tidak boleh mempercayai klien. Semua Logika yang Anda miliki harus setidaknya sisi server. Anda dapat mereproduksi sisi klien jika Anda mau, tetapi tidak ada solusi sisi klien saja yang akan melakukannya.

Omong-omong, jika Anda ingin menemukan kelemahan program Anda, jangan mengaburkannya, biarkan orang melihat kode Anda dan memberi tahu Anda "di sini, Anda memiliki masalah".

Itu baik untuk Anda, untuk kode Anda, untuk pengguna Anda dan untuk komunitas.


3
+1 untuk otoritas Server, itu tidak berfungsi jika Anda mencoba mempercayai klien ...
Valmond

Berbahaya untuk mereproduksi sisi klien. Berhati-hatilah dengan hal itu, karena jika semuanya direplikasi di sisi klien, pengguna dapat menipu dengan mencabut cek dengan server. Mereka kemudian dapat memainkan game, merekam video, dan menjadi bintang YouTube. Ini hanya berlaku untuk game pemain tunggal, yang akan menjadi game ini.
DampeS8N

Ketika saya berbicara tentang sisi klien, itu untuk "perhitungan gerakan", "tabrakan" dll ... Ini bisa dilakukan kedua belah pihak bahkan untuk permainan multipemain. Perhitungan sisi server harus selalu dianggap sebagai prioritas, tetapi ini dapat membantu ketika ada latensi server untuk memilikinya sisi klien. Tetapi untuk semua yang merupakan "periksa cheat" logika, maka saya setuju bahwa semuanya harus sisi server.
dievardump

Ya, saya mengerti. Tapi saya melakukan proyek ini sebagai hobi di waktu luang yang saya miliki. Melakukan pengecekan server semacam itu akan membuat kerumitan proyek banyak, sehingga tidak dapat dihidupkan. Yah, saya akan terus bergerak dengan proyek mengetahui itu, dan jika itu mulai menjadi lebih besar dan serius daripada saya bisa datang dengan mengendalikan sisi server yang serius, mungkin dengan Node.js.
Billy Ninja

ini jawaban yang lebih tepat untuk OP
Pengembang Game Noob

3

Nah, tempat yang baik untuk memulai adalah dengan menggunakan fungsi Object.freeze (yang akan memungkinkan perlindungan terhadap penambalan objek).

Ini "mencegah properti baru ditambahkan", "mencegah properti yang ada dihapus", "mencegah properti yang ada, atau enumerabilitas, konfigurabilitas, atau kemampuan menulis, dari diubah"; setiap perubahan pada keadaan internal harus dilakukan melalui pengakses. Contoh berikut berfungsi di chrome (harus bekerja di firefox, saya tidak tahu tentang IE ...):

var b = {}
// Fill your object with whatever you want
b.a = "ewq"
// Freeze all changes
Object.freeze(b)
// Try to put new value. This wont throw any error, put wont work either, 
// as we shall see ...
b.b = "qwe"

// Values 
console.log(b.a); // outputs "eqw"
console.log(b.b); // outputs  undefined

5
Bahkan ini hanya akan memperlambat penipu yang gigih. Jika tidak ada yang lain, ia dapat mencuri sumbernya, menyimpannya di mesinnya sendiri, dan menghapus kode pembekuan, dan kemudian menggunakan file host-nya untuk mengelabui browser-nya agar mengira halaman baru itu adalah yang lama, menghubungkan kembali dengan server.
DampeS8N

@ DampeS8N Ya, saya kira Anda benar.
fableal

Seperti yang saya katakan di OP, saya hanya ingin beberapa tingkat perlindungan.
Billy Ninja

Ini tidak akan membantu sama sekali! Pengguna hanya dapat mengatur breakpoint debugger di fungsi JS pertama yang dijalankan dan masuk Object.freeze = function(o) {};di konsol JS.
Philipp

2

Sayangnya, Anda harus mengikuti jalan diablo 3, jika Anda benar-benar khawatir tentang peretasan / cheat. jika tidak, maka cek dasar yang harus Anda lakukan atau sangat disarankan untuk dilakukan.

  • beli cek - Jika saya membeli sesuatu, saya harus memiliki cukup emas
  • sellchecks - Jika saya menjual sesuatu, saya harus memiliki barang itu di cek perdagangan inventaris saya - sama seperti menjual senjata
  • melengkapi pemeriksaan - Jika saya melengkapi senjata, apakah saya memiliki / memilikinya?
  • pemeriksaan kerusakan - Jika saya menyerang sesuatu (musuh), saya tidak dapat mengenai lebih dari kerusakan maksimum yang bisa terjadi pada senjata saya (di sini Anda seharusnya tidak mengharapkan klien untuk mengatakan senjata apa yang telah ia gunakan karena seharusnya sudah ada sebelumnya)
  • kerajinan cek - Jika saya membuat sesuatu, apakah saya memiliki semua bahan / komponen yang diperlukan?

... dan seterusnya

1 poin sedikit rumit adalah posisi pahlawan, karena Anda tidak terlalu khawatir tentang hal itu, Anda dapat meninggalkannya, tetapi lebih baik Anda melakukannya juga dengan cek minimum seperti di bawah ini

  • Saya di place1 @ T1, saya di place2 T2, berapa waktu minimum yang diperlukan untuk melakukan perjalanan dari place1 ke place2 dan cocok dengan T2 - T1 saya. Anda dapat memetakan ini dari kecil ke besar tergantung pada ukuran peta. Anda harus memiliki daftar setidaknya area utama seperti, NPC - boss, NPC - area spawn musuh (belum tentu lokasi tepatnya)

Semoga ini bisa membantu, kedengarannya sulit tetapi Anda harus belajar membuat game yang benar-benar berfungsi


Jawaban bagus! Saya sedang menulis pertanyaan tentang bagaimana mengimplementasikan pengecekan server, hanya untuk mengukur kira-kira seberapa sulit mengimplementasikan pengecekan server. Anda tahu, saya tidak ingin membuang banyak waktu untuk mengimplementasikan backbone mirip-MMO dan pada akhirnya itu masih mudah dicurangi hanya dengan mengesampingkan beberapa parameter permintaan klien atau sesuatu seperti itu. Atau sekadar melakukan apa yang seharusnya menjadi sekadar permainan yang menyenangkan-usaha yang sia-sia untuk keamanan alih-alih memberikan fitur yang lebih keren atau memoles hal-hal.
Billy Ninja

1

Ini pada dasarnya tidak mungkin. Akan sangat mudah untuk mengatasi apa pun yang Anda tempatkan untuk mencegah kecurangan.

Masalahnya adalah dengan perangkat lunak apa pun yang Anda distribusikan orang dapat memodifikasinya dengan mudah.

Selain itu jika mereka ingin menipu, biarkan mereka. Mereka hanya merusak game untuk diri mereka sendiri. Tidak ada penggunaan praktis nyata untuk menipu dalam situasi ini, Anda hanya akan menghancurkan gameplay untuk diri sendiri.


1

Saya punya ide untuk tindakan yang dapat Anda ambil untuk mencegah / mengurangi kecurangan (selain jawaban lain). Anda dapat mengaturnya agar klien tidak diberikan semua kode sumber pada satu waktu, melainkan setiap kali klien ingin, katakanlah, membeli item baru di toko, sehingga klien harus mengirim informasi tertentu ke server, dan hanya menerima semua informasi untuk apa pun yang mereka beli jika informasi semua sesuai dengan apa yang seharusnya. Jika tidak, server membuat daftar hitam IP mereka atau sesuatu.

Anda dapat menggunakan ini bersamaan dengan apa yang dikatakan Dampes8n tentang menggunakan versi sumber yang berbeda, bahwa jika Anda dapat menemukan cara untuk menghasilkan banyak versi yang berbeda, sehingga setiap pengguna akan menjalankan versi sumber yang sama sekali berbeda setiap kali, yang gagal periksa daftar hitam bahwa versi sumber, juga, bahwa itu tidak akan pernah memberikan info item yang benar untuk versi sumber itu lagi.

Alasan utama ini akan efektif adalah bahwa jika seorang hacker tidak mendapatkan hack yang benar pertama kali, ini akan membuat mereka lebih sulit untuk memodifikasi hack, karena setiap kali hack tidak bekerja dengan sempurna, mereka harus ganti IP mereka dan tulis hack sekali lagi untuk versi sumber baru.


Saya akan berhati-hati. Hal terakhir yang ingin Anda lakukan adalah secara tidak sengaja melarang pelanggan yang membayar.
John McDonald

@JohnMcDonald Benar, itu. Mungkin hanya membunuh versi sumber itu. Dengan begitu jika mereka secara tidak sengaja memicu jebakan, mereka hanya perlu menyegarkan browser, sementara masih membuat peretas mengkode ulang semua peretasan mereka.
AJMansfield

0

Ya, itu tidak bisa sepenuhnya dilakukan. Selalu periksa di server. Apa pun yang berdampak pada permainan harus memerlukan otorisasi dari server.

Itu adalah batas di mana saya akan mengulangi jawaban lain.

Namun, kita dapat melakukan lebih banyak pada akhir mencegah penipuan daripada hanya memeriksa di server. Yah, kita mungkin harus menambahkan beberapa pemeriksaan server khusus. Namun, perlu diketahui bahwa pemeriksaan sisi klien tidak berharga, mereka menghemat bandwidth dan kerja server ketika curang tidak terlibat.

Dengan mengatakan:

  • Mengurangi klien kasar: Melayani lebih dari HTTPS, gunakan Cross-origin resource sharing (CORS), hanya izinkan asal yang sama, gunakan integritas sub-sumber daya. Saya menyarankan untuk menerapkan pekerja layanan untuk menegakkannya pada semua permintaan, yang juga berarti bahwa permainan tidak akan berfungsi dengan hanya memindahkannya ke HTTP (karena tanpa HTTPS tidak ada pekerja layanan, pekerja server melakukan bagian klien dari CORS dan server mengharapkan CORS), dan jika mereka melayani lebih dari HTTPS itu tidak akan berfungsi karena server akan menolak asal lainnya.
  • Mitigasi skrip: Gunakan otentikasi dan minta token untuk melakukan tindakan apa pun. Setiap siklus pembaruan server harus memberikan token baru kepada klien, dan token dikonsumsi dengan melakukan apa pun yang dilakukannya ... melakukan apa pun memerlukan token yang valid, token selalu berubah, dan dengan demikian tidak layak ditebak, dan jika klien mengirimkan token yang sama dua kali atau mengirimkan token yang salah server tahu bahwa ada sesuatu yang terjadi. Untuk perlindungan ekstra: buat kode otentikasi pesan (MAC) token dengan kunci rahasia dan tambahkan ke cookie. Memodifikasi cookie akan mematikan sesi (dan mereka perlu menebak kunci), dan memodifikasi token akan membuat pemeriksaan MAC gagal.
  • Modifikasi kode mitigasi: Selain integritas sub-sumber daya (yang browser modern juga akan memeriksa runtime), simpan variabel Anda di bawah lingkup terbatas (menggunakan biarkan, menjalankan sendiri fungsi anonim, dan modul javascript). Juga, tidak bergantung pada DOM (DOM hanya untuk IO, bukan penyimpanan, jika Anda perlu melampirkan atribut yang membungkus objek DOM Anda dan menambahkannya ke pembungkus). Dengan cara ini, apa pun yang Anda di konsol seharusnya tidak dapat mencapai logika permainan (kecuali jika Anda mengeksploitasi kerentanan browser). Anda juga dapat mempertimbangkan menggunakan teknik untuk mendeteksi alat pengembang (ini spesifik per browser, dan mungkin tidak berfungsi dalam semua kasus atau berhenti bekerja di masa depan ... dengan demikian, ini adalah perlombaan senjata).
  • Ada sesuatu? Apakah sesi istirahat? Tendang pemain dari pertandingan saat ini, minta untuk masuk lagi. Pertimbangkan captcha ... yang juga bermanfaat memberi tahu pengguna bahwa "kami tahu sesuatu yang langka sedang terjadi" (itu bukan kegagalan server acak), dan ya, itu adalah bentuk mitigasi. Oh, dan jangan foget untuk mencatat ini. Anda harus dapat memverifikasi mengapa itu terjadi, baik untuk mencegah postur palsu dan untuk menjawab tiket dukungan.

Ya, ini semua adalah mitigasi. Kami masih dapat memiliki browser yang dibuat khusus yang tidak akan memeriksa integritas dan membiarkan Anda menjangkau dan mengacaukan variabel dalam lingkup lokal ... maka kode game akan mengirim data yang dimodifikasi dengan token yang tepat, dan di situlah server melakukan pemeriksaan server. bermain.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.