Ini adalah masalah klasik dengan game dan kontes Internet. Kode Flash Anda berfungsi dengan pengguna untuk menentukan skor untuk sebuah game. Tetapi pengguna tidak dipercaya, dan kode Flash berjalan di komputer pengguna. Anda SOL. Tidak ada yang dapat Anda lakukan untuk mencegah penyerang menempa skor tinggi:
Flash bahkan lebih mudah untuk direkayasa ulang dari yang Anda kira, karena bytecode didokumentasikan dengan baik dan menggambarkan bahasa tingkat tinggi (Actionscript) --- ketika Anda menerbitkan game Flash, Anda menerbitkan kode sumber Anda, apakah Anda tahu atau tidak.
Penyerang mengontrol memori runtime dari interpreter Flash, sehingga siapa pun yang tahu cara menggunakan debugger yang dapat diprogram dapat mengubah variabel apa pun (termasuk skor saat ini) kapan saja, atau mengubah program itu sendiri.
Serangan paling sederhana yang mungkin dilakukan terhadap sistem Anda adalah dengan menjalankan lalu lintas HTTP untuk game melalui proxy, menangkap save skor tinggi, dan memutarnya kembali dengan skor yang lebih tinggi.
Anda dapat mencoba memblokir serangan ini dengan mengikat setiap penyimpanan skor tinggi ke satu instance game, misalnya dengan mengirimkan token terenkripsi kepada klien pada permulaan game, yang mungkin terlihat seperti:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Anda juga bisa menggunakan cookie sesi dengan efek yang sama).
Kode permainan menggaungkan token ini kembali ke server dengan save skor tinggi. Tapi seorang penyerang masih bisa meluncurkan permainan lagi, mendapatkan token, dan kemudian segera menempelkan token itu ke save skor tinggi yang diputar ulang.
Jadi selanjutnya Anda memberi makan tidak hanya token atau cookie sesi, tetapi juga kunci sesi enkripsi-skor tinggi. Ini akan menjadi kunci AES 128 bit, yang dienkripsi dengan kunci yang di-kodekan ke dalam game Flash:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Sekarang sebelum permainan memposting skor tinggi, itu mendekripsi kunci sesi enkripsi tinggi skor, yang dapat dilakukan karena Anda melakukan hardcode kunci sesi enkripsi-skor tinggi-kunci-dekripsi-ke-biner ke dalam biner Flash. Anda mengenkripsi skor tinggi dengan kunci yang didekripsi ini, bersama dengan hash SHA1 dari skor tinggi:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
Kode PHP di server memeriksa token untuk memastikan permintaan datang dari instance game yang valid, lalu mendekripsi skor tinggi terenkripsi, memeriksa untuk memastikan skor tinggi cocok dengan SHA1 skor tinggi (jika Anda melewatkan langkah ini , dekripsi hanya akan menghasilkan skor acak, kemungkinan sangat tinggi, tinggi).
Jadi sekarang penyerang mendekompilasi kode Flash Anda dan dengan cepat menemukan kode AES, yang menonjol seperti jempol yang sakit, meskipun jika tidak dilacak dalam 15 menit dengan pencarian memori dan pelacak ("Saya tahu skor saya untuk game ini adalah 666, jadi mari kita cari memori dalam memori, lalu tangkap operasi apa pun yang menyentuh nilai itu --- oh, lihat, kode enkripsi skor tinggi! "). Dengan kunci sesi, penyerang bahkan tidak perlu menjalankan kode Flash; dia meraih token peluncuran game dan kunci sesi dan dapat mengirim kembali skor tinggi yang sewenang-wenang.
Anda sekarang berada pada titik di mana sebagian besar pengembang menyerah --- memberi atau mengambil beberapa bulan mengacaukan penyerang dengan:
Mengacak kunci AES dengan operasi XOR
Mengganti array byte kunci dengan fungsi yang menghitung kunci
Menyebarkan enkripsi kunci palsu dan posting skor tinggi di seluruh biner.
Ini semua kebanyakan buang-buang waktu. Tak perlu dikatakan, SSL juga tidak akan membantu Anda; SSL tidak dapat melindungi Anda ketika salah satu dari dua titik akhir SSL jahat.
Berikut adalah beberapa hal yang sebenarnya dapat mengurangi penipuan skor tinggi:
Wajibkan login untuk memainkan game, minta login menghasilkan cookie sesi, dan jangan izinkan beberapa peluncuran game luar biasa pada sesi yang sama, atau beberapa sesi bersamaan untuk pengguna yang sama.
Tolak skor tinggi dari sesi game yang bertahan kurang dari game nyata terpendek yang pernah dimainkan (untuk pendekatan yang lebih canggih, cobalah "mengkarantina" skor tinggi untuk sesi game yang bertahan kurang dari 2 standar deviasi di bawah durasi rata-rata game). Pastikan Anda melacak durasi permainan di sisi server.
Tolak atau karantina skor tinggi dari login yang hanya memainkan permainan sekali atau dua kali, sehingga penyerang harus menghasilkan "jejak kertas" dari permainan yang tampak masuk akal untuk setiap login yang mereka buat.
Skor "Detak Jantung" selama bermain game, sehingga server Anda melihat pertumbuhan skor selama masa pakai satu permainan. Tolak skor tinggi yang tidak mengikuti kurva skor yang masuk akal (misalnya, melompat dari 0 hingga 999999).
Status permainan "Snapshot" selama bermain game (misalnya, jumlah amunisi, posisi di level, dll), yang nantinya dapat Anda rekonsiliasi dengan skor sementara yang direkam. Anda bahkan tidak harus memiliki cara untuk mendeteksi anomali dalam data ini untuk memulai; Anda hanya perlu mengumpulkannya, dan kemudian Anda dapat kembali dan menganalisisnya jika semuanya terlihat mencurigakan.
Nonaktifkan akun pengguna mana pun yang gagal salah satu dari pemeriksaan keamanan Anda (misalnya, dengan pernah mengirimkan skor tinggi terenkripsi yang gagal validasi).
Ingat juga bahwa Anda hanya mencegah penipuan skor tinggi di sini. Tidak ada yang bisa Anda lakukan untuk mencegahnya. Jika ada uang di telepon dalam gim Anda, seseorang akan mengalahkan sistem apa pun yang Anda hasilkan. Tujuannya bukan untuk menghentikan serangan ini; itu untuk membuat serangan lebih mahal dari sekadar menjadi benar-benar hebat dalam permainan dan mengalahkannya.