Mengamankan data HTTP dari game JavaScript ke server

8

Misalkan saya sedang melakukan permainan JavaScript, dan saya ingin permainan memperbarui server jika pengguna telah berhasil menyelesaikan permainan dan hasilnya.

Bagaimana saya memastikan bahwa permintaan datang dari permainan JavaScript, dan bahwa data yang dikirim belum dirusak. Saya menggunakan PHP sebagai bahasa sisi server.

Saya benar-benar mengerti bahwa tidak ada strategi yang 100% tahan terhadap kesalahan, dan tindakan apa pun yang diambil lebih merupakan pencegahan daripada perlindungan absolut.

Pada Edit: Seharusnya kita tidak menggunakan verifikasi server dari setiap langkah pengguna (seperti pada MMO tradisional). Gim ini bisa berupa gim mini sebagai bagian dari gim web atau gim edukasional (penyerbu luar angkasa atau gim real-time, misalnya) dan membutuhkan komponen sisi server agar setiap gim tersebut bisa membosankan.

Contoh: Misalkan, ketika permainan selesai, permintaan dikirim ke server melalui. AJAX

game_finished.php?user_id=1&outcome=success&score=88

Seorang pengguna dapat 'memalsukan' server dengan meyakini bahwa game telah selesai dengan benar dengan mengirimkan permintaan itu ke game_finished.php. Bagaimana ini bisa menjadi lebih sulit?

Extrakun
sumber

Jawaban:

10

teka-teki balok geser, misalnya

Ini adalah contoh di mana verifikasi sisi server sepele. Tidak perlu memverifikasi setiap langkah sampai permainan selesai. Cukup kirim seluruh daftar pemindahan, dan server memutar ulang untuk memastikan itu benar.

(Sunting: Inti dari jawaban ini bukan untuk mengambil contoh sampai Anda menemukan contoh yang tidak dapat divalidasi secara sepele. Sebaliknya, itu akan membuat Anda kembali dan melihat permainan yang sebenarnya Anda buat - itu mungkin dapat divalidasi secara trivial, atau hanya perlu sedikit penyesuaian.)


sumber
Saya sedang memikirkan contoh dan itu bukan contoh terbaik. Katakanlah Space Invaders kalau begitu. Saya akan memperbarui pertanyaan.
Extrakun
2
Pergerakan Space Invaders juga sepenuhnya deterministik. Anda hanya perlu merekam ketika setiap pasangan tembakan / klik terjadi, mensimulasikan gerakan hingga saat itu (yang merupakan persamaan linear sederhana), dan pastikan itu benar-benar hit.
Saya akhirnya mengerti apa yang Anda maksud setelah memikirkannya. Terima kasih
Extrakun
Hanya tambahan pada aspek "totally deterministic": Jika Anda membutuhkan keacakan dalam gim Anda, berikan seed tertentu untuk keacakan itu ke klien dan simpan seed itu di server. Ketika klien mengirimkan log gameplay untuk konfirmasi, server dapat memutar ulang bagian yang melibatkan keacakan juga. Hal yang sama dimungkinkan untuk langkah-langkah yang bergantung pada waktu setempat. Lihat algoritma Undum ( undum.com ) dan muat sebagai contoh bagaimana hal ini dapat dilakukan dalam JavaScript.
BerndBrot
2

Anda dapat melakukannya dengan cara Warcraft: Gunakan Javascript hanya untuk mengirim perintah gerakan ke server, dan biarkan server menangani logika.

Ini masih membuat Anda terbuka untuk robot (program javascript yang memindahkan banyak hal lebih cepat daripada yang dimungkinkan secara manusiawi), tetapi itu adalah langkah besar dibandingkan membiarkan pintu terbuka pada trik /game_finished.php.

egarcia
sumber
1

Jika Anda meminta klien menghitung skor, tidak ada cara untuk memvalidasinya di luar (seperti yang ditunjukkan) meminta server memutar ulang permainan untuk mengonfirmasi bahwa skornya sama.

Ada beberapa jenis permainan yang bisa Anda desain yang tidak berfungsi hanya berdasarkan skor numerik. Skrip sisi server dapat menghasilkan masalah matematika tambahan acak misalnya, dan ketika pengguna mengirimkan jawaban, skrip tersebut dapat membandingkan jawaban mereka dengan yang benar dan memberi skor pada sisi server.

Tetapi jika gim Anda adalah gim yang rumit (seperti contoh penyerbu luar angkasa), tidak banyak yang dapat Anda lakukan selain a) mempercayai klien, atau b) membiarkan server mengelola gim tersebut.

Tim Holt
sumber
-1

Ada banyak metode, tetapi semuanya akan gagal pada akhirnya. Anda dapat menambahkan beberapa nilai hash, atau kunci kueri yang diperbarui dengan setiap kueri.

Tetapi yang paling penting adalah, bahwa semua fungsi super encoding Anda dikirim sebagai kode sumber ke browser klien dan itu adalah masalah. Untuk membuatnya sedikit lebih sulit, Anda dapat menggunakan fungsi kirim dengan permintaan Ajax, sehingga sumber tidak akan tersedia di bawah url. Fungsi harus dikirim terkompresi, dan mungkin bahkan di bagian, sehingga akan lebih sulit untuk menyalin semuanya. Saya juga akan memeriksa kode ini di halaman seperti http://jsbeautifier.org/ jika setelah membuatnya mudah dibaca kode Anda mudah dimengerti.

Pemikir
sumber