Bagaimana Anda mencegah permainan web JavaScript / HTML5 Anda disalin atau diubah?


45

Saya sedang merencanakan permainan yang dibangun menggunakan JavaScript dan HTML5.

Saya mengalami kesulitan memahami bagaimana Anda dapat mencegah seseorang dari hanya menyalin JavaScript dari server web dan baik membuat game sendiri dengan itu (bukan masalah terbesar saya), atau mengganti fungsi JavaScript mereka sendiri dan menghancurkan harapan untuk klien yang dapat diandalkan di liar jika permainan itu pada akhirnya mendukung multiplayer.

Adakah yang bisa dilakukan untuk mencegah sembarang orang membaca JavaScript?

Jika tidak, haruskah semua pemrosesan game dilakukan di server di suatu tempat dengan satu-satunya tanggung jawab klien adalah menangkap input pengguna dan menggambar grafik?


22
Anda paragraf terakhir membaca tentang benar, itu benar untuk aplikasi bisnis, dan itu benar untuk permainan, selalu memperlakukan klien sebagai hostle.
Nate

4
Jika saya bisa BACA, browser saya sudah memiliki salinan. Maka saya juga bisa menyimpannya di tempat lain. Apa pun yang Anda izinkan untuk dibaca, juga dapat disalin.
BerggreenDK

Jawaban:


44

Simpan semua data dan logika game Anda di server. Bagian dari gim yang ada di sisi klien dapat disalin menggunakan alat yang sesuai pula (bahkan jika itu ada di Flash atau Java), jadi terima saja dan jangan terlalu peduli.

Untuk menjaga agar javascript Anda tidak dapat disalin, karena keterbacaan yang buruk, Anda dapat memperkecilnya . Lagipula itu praktik yang bagus karena membuat situs game mengunduh lebih cepat.


4
Tergantung pada praktik pengkodean, semua konten di server dapat dikompromikan juga. Untuk mengecilkan kode dan mengaburkan hanya menghalangi mereka yang tidak ingin meluangkan waktu dan secara logis memetakan apa yang dilakukannya. Intinya adalah, jika Anda khawatir tentang hak kekayaan intelektual kode Anda; jangan taruh di web.
John

1
Itu tidak berarti Anda tidak boleh mengecilkan, yang menghalangi orang malas. Anda juga dapat mencoba memproses logika gim Anda di server dan mengembalikan objek json melalui ajax, tetapi pengembaliannya masih dapat dilihat dengan firebug. Mengaburkan versi produksi Anda tetapi simpan sendiri versi komentar yang banyak (ini membuat pemeliharaan lebih sulit). Anda dapat melakukan hal-hal untuk menghalangi orang, tetapi tidak pernah 100% aman.
John

3
Memang. Memperluas kode yang diperkecil bahkan tidak membutuhkan banyak usaha. jsbeautifier.org
James

@John harap perhatikan bahwa kadang-kadang menghalangi orang malas tidak relevan, karena beberapa game hancur setelah satu penipu tunggal muncul, jadi itu tidak relevan jika hanya satu atau banyak yang curang.
o0 '.

11

bagaimana Anda dapat mencegah seseorang dari hanya menyalin JavaScript dari server web dan membuat game sendiri dengan itu (bukan masalah terbesar saya)

Di sinilah hukum membantu. Dalam praktiknya hal ini tampaknya tidak terlalu sering terjadi.

atau mengganti fungsi JavaScript mereka sendiri dan memupus harapan untuk klien yang andal di alam liar jika game itu pada akhirnya mendukung multiplayer.

Tidak ada klien yang dapat diandalkan di alam liar, untuk alasan seperti ini. Menyerah pada mimpi ini sekarang. :)


Undang-undang tidak akan banyak berguna ketika situs hostingnya berada di negara yang tidak terlalu peduli tentang hak kekayaan intelektual, atau sebaliknya bertentangan dengan negara Anda karena alasan apa pun. Bahkan ketika itu tidak terjadi, biaya memulai tindakan hukum (berpotensi internasional) kemungkinan jauh melampaui sumber daya keuangan seseorang yang akan mengajukan pertanyaan ini di sini.
Paul Legato

Maksud dari jawaban itu bukan untuk merekomendasikan tindakan hukum, tetapi untuk menyarankan bahwa mencoba untuk mengunci perangkat lunak seperti itu sebagian besar tidak ada gunanya, setidaknya sebagian karena banyak orang yang akan menyalinnya tidak disarankan oleh hukum, tetapi juga karena klien dapat direkayasa balik apakah mereka menggunakan Javascript atau tidak.
Kylotan

8

Seperti yang direkomendasikan semua orang; simpan kode sebanyak mungkin di sisi server.

Suatu metode yang saya gunakan untuk menangani penyalinan kode agak aneh, tetapi sejauh ini telah bekerja dengan baik.

  • Sisi server, hasilkan id unik dan simpan untuk nanti.
  • Sisi server, tambahkan id unik dalam elemen skrip selama rendering html.
  • Sisi klien, buat koneksi WebSocket dan berikan id unik ke server.
  • Sisi server, cocokkan id dengan daftar saat ini.
  • Jika tidak ada yang cocok, tutup koneksi.
  • Jika pertandingan yang ditemukan, ganti handler pesan dengan Anda salah satu "tepat" dan id buang.
  • Streaming kode rahasia Anda ke klien sebagai JSON, {"func": "function () {dostuff ();}"}
  • Di sisi klien, perhatikan pesan, jika mengandung "func", lakukan eval.

Sekarang kode rahasia Anda mengeksekusi sisi klien dan tidak akan muncul di sumber tampilan atau inspektur / konsol. Masih ada cara untuk mendapatkan kode, tetapi ini sedikit lebih sulit.


Jika saya perlu mengambil sesuatu dari solusi di atas; Saya akan menghubungkan WebSocket yang sebenarnya juga dan mencoba membuat "klien palsu", atau menggunakan alat debugging Firebug di browser dan hanya menghentikan skrip untuk memeriksa nilai-nilai.
BerggreenDK

Anda tidak dapat membuat klien palsu kecuali jika Anda dapat memprediksi id unik apa yang saat ini tersedia, karena dihasilkan pada waktu buka halaman dan dilemparkan pada waktu koneksi skrip. Juga, menghentikan skrip dan melihat nilai-nilai sulit, karena Anda mengevaluasi fungsi anonim. Seperti saya katakan, masih ada cara untuk mendapatkan kode, hanya saja lebih sulit. Sebagian besar, cukup sehingga kode Anda harus "cukup aman". Anda tidak dapat melakukan lebih dari itu dengan kode sisi klien.
Stephen Belanger

Akan sangat mudah untuk menulis klien palsu yang hanya memuat klien asli dari server dan menghapus nilai rahasia saat itu setiap kali dimulai.
Paul Legato

Saya tidak akan mengatakan itu "mudah" sebanyak "tidak mustahil". Seperti yang saya katakan, ada cara untuk mengatasinya. Tidak ada sistem yang sangat aman. Hanya antarmuka yang cukup tertutup sehingga sebagian besar akan merasa terlalu banyak upaya untuk meretas. Dalam hal ini, Anda akan mengalirkan bit kode, sehingga peretas perlu membuat klien untuk menerima dan mengatur kode menjadi struktur yang bermanfaat. Anda akan mengalirkan kode sesuai kebutuhan, sehingga peretas tidak akan memiliki akses langsung ke dump kode lengkap.
Stephen Belanger

3

Satu-satunya cara untuk memastikan bahwa kode permainan Anda akan aman adalah dengan membangun jenis permainan klien / server dan memasukkan sebanyak mungkin kode di server. Dan tentu saja, buat server itu aman!

Masalah utama adalah bahwa jika kode berjalan di komputer saya, saya bisa memeriksanya, mendekompilasinya, dan mencari tahu cara kerjanya. Ini berlaku untuk JavaScript, Flash, C ++, apa pun. Bahkan, dalam pengembangan MMO (yang merupakan tempat sebagian besar pengalaman profesional saya) asumsi dari awal adalah bahwa klien dikompromikan: apa pun yang Anda tulis untuk klien sudah ada di tangan siapa pun yang menginginkannya, jahat atau tidak.

Kode minifying memang memberikan sejumlah kecil perlindungan terhadap orang-orang yang terlalu malas untuk menghapusnya menggunakan salah satu dari banyak alat di luar sana. (Tetapi kode produksi harus dikurangi untuk mengurangi jejak data.)

Tetapi jika Anda berada dalam situasi di mana, katakanlah, atasan Anda menginginkan semacam perlindungan kode, Anda dapat menggunakan google "Javascript obfuscator" - ada banyak perangkat lunak gratis dan berbayar di luar sana yang membuat JS setidaknya memiliki kekebalan. untuk mendekompilasi seperti Flash.


Saya hanya ingin menunjukkan bahwa C ++ tidak berada pada level yang sama dengan Javascript. C ++ mengkompilasi ke assembly, yang harus dibaca seseorang untuk memahami logika game. Setiap pernyataan dalam C ++ dapat membuat banyak baris dalam perakitan, yang membuatnya menjadi tugas yang sangat memakan waktu. Mengaburkan javascript tidak sama, karena bahasa yang sama. Siapa pun dapat "mempercantik" dan mulai membaca pernyataan yang hampir bisa dibaca manusia.
TomTsagk

3

Selain semua pembicaraan tentang kebingungan kode ini, pastikan untuk meletakkan deklarasi hak cipta yang sangat jelas di bagian atas setiap file dan jelaskan bahwa lisensi tidak memungkinkan untuk perubahan atau penggunaan komersial. Ini memberi Anda jalan hukum jika seseorang mencoba menyalinnya. Jika Anda tidak mau ke pengadilan untuk itu, maka seluruh pertanyaan ini sebagian besar bersifat akademis.


Ini bagus untuk apa nilainya, tapi itu tidak banyak. Konsep kekayaan intelektual dalam praktiknya tidak diakui di banyak negara, dan dalam kasus apa pun biaya hukum dari kasus pengadilan kemungkinan jauh melebihi apa yang tersedia poster untuk situs ini, terutama jika penyerang berada di negara lain.
Paul Legato

0

Saya pikir jika Anda membuat gim multi-pemain, yang mengharuskan Anda menjaga logika gim di server, Anda mungkin akan membuatnya paling tidak menarik untuk dicuri. Anda benar-benar tidak bisa mempercayai klien. Seperti yang telah disebutkan oleh seseorang, ada alat untuk bahasa yang dikompilasi seperti Java dan Flash, yang dapat merekayasa balik teks kode dari kode byte.


-1

Anda perlu menggunakan Javascript Minifier. Ada banyak opsi yang tersedia, jangan ragu untuk menemukan yang Anda sukai. Untuk menghemat beberapa riset, inilah yang bisa Anda coba Yahoo Minifier . Saya belum menjalankannya sendiri tetapi saya menganggap itu akan melakukan apa yang Anda butuhkan. Tujuannya adalah untuk 1) mengurangi ukuran file dan 2) mengaburkan kode. Ini dilakukan dengan menghapus semua spasi putih, komentar, dan mengganti nama variabel dengan yang lebih pendek, tidak masuk akal.

Sebagian besar aplikasi web saat ini memiliki jumlah Javascript yang signifikan dan menggunakan alat-alat seperti ini untuk mencoba melindungi IP mereka. Seperti yang orang lain katakan, Anda harus selalu bertanya, "Bisakah saya melakukan ini di server?" untuk operasi penting atau sensitif, tetapi saya percaya ini harus menawarkan perlindungan.


7
Keamanan oleh ketidakjelasan mengaburkan potensi keamanan. :)
Rushyo

1
Bisa aja. Saya mendengar kutipan ini sepanjang waktu tetapi sama sekali tidak benar. Sejujurnya mengaburkan JS setidaknya akan menghalangi beberapa orang.

2
Minifier tidak membantunya. Saya percaya sebagian besar orang "serius" tahu bagaimana "memperluas" skrip-skrip itu lagi.
BerggreenDK

1
@Sergio: Anda mendengar kutipan ini sepanjang waktu karena, Anda tahu, itu benar . Ini akan menghalangi "beberapa" orang, benar, tetapi mencegah "beberapa" orang tidak ada gunanya: ketika Anda retak sekali , Anda turun.
o0 '.

-1

Gunakan kompilator penutupan Google http://code.google.com/closure/compiler/ Ini bukan hanya minimizer js;)

Apa manfaat menggunakan Closure Compiler?

  1. Efisiensi. Closure Compiler mengurangi ukuran file JavaScript Anda dan membuatnya lebih efisien, membantu aplikasi Anda memuat lebih cepat dan mengurangi kebutuhan bandwidth Anda.

  2. Pemeriksaan kode. Closure Compiler memberikan peringatan untuk JavaScript ilegal dan peringatan untuk operasi yang berpotensi berbahaya, membantu Anda menghasilkan JavaScript yang kurang bermasalah dan mudah dipelihara.


-1

Atau Anda bisa menggunakan sesuatu seperti Game Maker HTML5 untuk membuat game Anda yang akan membingungkan kode untuk Anda. Itu berarti bahwa itu akan membuat kode tidak dapat dibaca oleh manusia. Dan hampir tidak mungkin untuk mengedit.


2
-1 Kebingungan hanya akan sejauh ini. Itu tentu tidak akan melindungi game dari disalin atau diubah - seperti yang telah disebutkan pada jawaban kebingungan lainnya untuk pertanyaan ini.
doppelgreener

-1

Kepemilikan apa pun harus disimpan di sisi server. Sisi klien yang Anda berikan hanya cukup untuk memfasilitasi penggunaan permainan mereka.


-1

Menempatkan segala sesuatu di server dapat memiliki masalah kinerja dan tidak benar-benar menggunakan semua potensi web seperti yang kita kenal sekarang.

Anda dapat menulis kode Anda di c ++ dan mengompilasinya ke binari.

Klien Asli (NaCl).

Lihat https://stackoverflow.com/questions/9018537/how-to-run-c-programs-on-the-web-inside-a-browser


Selamat datang di GDSE. OP bertanya tentang JavaScript secara khusus; jadi sementara mereka mungkin bisa menulis ulang ke C ++ & menggunakan NaCl, solusi itu tidak benar-benar memenuhi kebutuhan seperti yang dinyatakan. Selain itu, jawaban harus seadanya mungkin - cukup dengan menyebutkan NaCl & membuang tautan tidak sebaik menawarkan ringkasan tentang apa itu NaCl atau mengapa itu bisa membantu.
Pikalek
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.