it-swarm-id.com

Apa cara terbaik untuk menghentikan orang meretas tabel highscore berbasis PHP dari game Flash

Saya berbicara tentang permainan aksi tanpa batas skor atas dan tidak ada cara untuk memverifikasi skor di server dengan memutar ulang gerakan dll.

Yang benar-benar saya butuhkan adalah enkripsi terkuat di Flash/PHP, dan cara untuk mencegah orang memanggil halaman PHP selain melalui file Flash saya. Saya telah mencoba beberapa metode sederhana di masa lalu membuat beberapa panggilan untuk skor tunggal dan menyelesaikan urutan checksum/fibonacci dll, dan juga mengaburkan SWF dengan Amayeta SWF Encrypt, tetapi mereka semua akhirnya diretas.

Berkat respons StackOverflow, sekarang saya telah menemukan beberapa info lebih lanjut dari Adobe - http://www.Adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.html dan https: // github .com/mikechambers/as3corelib - yang saya pikir dapat saya gunakan untuk enkripsi. Tidak yakin ini akan membuat saya berkeliling CheatEngine.

Saya perlu tahu solusi terbaik untuk AS2 dan AS3, jika mereka berbeda.

Masalah utama tampaknya adalah hal-hal seperti header TamperData dan LiveHTTP, tapi saya mengerti ada alat peretasan yang lebih canggih juga - seperti CheatEngine (terima kasih Mark Webster)

212
Iain

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 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 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 saat startup 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 kunci skor tinggi-mendekripsi-kunci-dekripsi-ke 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 pada 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 dari 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 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 sebagian besar 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 benar-benar 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 game 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 wajar (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. Ada tidak ada yang dapat Anda lakukan untuk mencegah jika. Jika ada uang di telepon dalam gim Anda, seseorang akan mengalahkan sistem apa pun yang Anda hasilkan. Tujuannya bukan untuk berhenti serangan ini; itu untuk membuat serangan lebih mahal dari sekedar menjadi benar-benar hebat dalam permainan dan mengalahkannya.

414
tqbf

Anda mungkin mengajukan pertanyaan yang salah. Anda tampaknya berfokus pada metode yang digunakan orang untuk meningkatkan daftar skor tinggi mereka, tetapi memblokir metode tertentu hanya berjalan sejauh ini. Saya tidak punya pengalaman dengan TamperData, jadi saya tidak bisa berbicara tentang itu.

Pertanyaan yang harus Anda tanyakan adalah: "Bagaimana saya bisa memverifikasi bahwa skor yang dikirim valid dan otentik?" Cara spesifik untuk melakukannya bergantung pada game. Untuk permainan puzzle yang sangat sederhana, Anda dapat mengirim skor bersama dengan keadaan awal spesifik dan urutan gerakan yang menghasilkan kondisi akhir, dan kemudian jalankan kembali permainan di sisi server menggunakan gerakan yang sama. Konfirmasikan bahwa skor yang dinyatakan sama dengan skor yang dihitung dan hanya menerima skor jika cocok.

25
Stephen Deken

Cara mudah untuk melakukan ini adalah dengan memberikan hash kriptografi nilai highscore Anda bersama dengan skor itu sendiri. Misalnya, saat memposting hasil melalui HTTP GET: http://example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

Saat menghitung checksum ini, rahasia bersama harus digunakan; rahasia ini tidak boleh ditransmisikan melalui jaringan, tetapi harus dikodekan dengan keras di dalam backend PHP dan flash frontend. Checkum di atas dibuat dengan menambahkan string " rahasia "ke skor" 500 ", dan menjalankannya melalui md5sum.

Meskipun sistem ini akan mencegah pengguna memposting skor acak, itu tidak mencegah "serangan replay", di mana pengguna memposting ulang skor yang dihitung sebelumnya dan kombinasi hash. Pada contoh di atas, skor 500 akan selalu menghasilkan string hash yang sama. Beberapa risiko ini dapat dikurangi dengan memasukkan lebih banyak informasi (seperti nama pengguna, stempel waktu, atau alamat IP) dalam string yang akan di-hash. Meskipun ini tidak akan mencegah pemutaran ulang data, itu akan memastikan bahwa satu set data hanya berlaku untuk satu pengguna pada satu waktu.

Untuk mencegah serangan replay terjadi, beberapa jenis sistem respons-tantangan harus dibuat, seperti berikut ini:

  1. Game flash ("klien") melakukan GET HTTP dari http://example.com/highscores.php tanpa parameter. Halaman ini mengembalikan dua nilai: nilai garam yang dihasilkan secara acak, dan hash kriptografis dari nilai garam tersebut dikombinasikan dengan rahasia bersama. Nilai garam ini harus disimpan dalam basis data lokal dari kueri yang tertunda, dan harus memiliki stempel waktu yang terkait dengannya sehingga dapat "kedaluwarsa" setelah mungkin satu menit.
  2. Permainan flash menggabungkan nilai garam dengan rahasia bersama dan menghitung hash untuk memverifikasi bahwa ini cocok dengan yang disediakan oleh server. Langkah ini diperlukan untuk mencegah gangguan pada nilai garam oleh pengguna, karena memverifikasi bahwa nilai garam sebenarnya dihasilkan oleh server.
  3. Game flash menggabungkan nilai garam dengan rahasia bersama, nilai skor tinggi, dan informasi terkait lainnya (nama panggilan, ip, cap waktu), dan menghitung hash. Kemudian mengirimkan informasi ini kembali ke PHP backend melalui HTTP GET atau POST, bersama dengan nilai garam, skor tinggi, dan informasi lainnya.
  4. Server menggabungkan informasi yang diterima dengan cara yang sama seperti pada klien, dan menghitung hash untuk memverifikasi bahwa ini cocok dengan yang disediakan oleh klien. Itu kemudian juga memverifikasi bahwa nilai garam masih valid seperti yang tercantum dalam daftar permintaan yang tertunda. Jika kedua kondisi ini benar, itu menulis skor tinggi ke tabel skor tinggi dan mengembalikan pesan "sukses" yang ditandatangani kepada klien. Itu juga menghapus nilai garam dari daftar permintaan yang tertunda.

Harap diingat bahwa keamanan salah satu teknik di atas dikompromikan jika rahasia bersama dapat diakses oleh pengguna

Sebagai alternatif, beberapa bolak-balik ini dapat dihindari dengan memaksa klien untuk berkomunikasi dengan server melalui HTTPS, dan memastikan bahwa klien telah dikonfigurasikan untuk mempercayai hanya sertifikat yang ditandatangani oleh otoritas sertifikat tertentu yang Anda sendiri memiliki akses ke .

18
stormlash

Saya suka apa yang dikatakan tpqf, tetapi alih-alih menonaktifkan akun saat ditemukan kecurangan, terapkan honeypot sehingga setiap kali mereka masuk, mereka melihat skor yang diretas dan tidak pernah curiga bahwa mereka telah ditandai sebagai troll. Google untuk "phpBB MOD Troll" dan Anda akan melihat pendekatan yang cerdik.

11
DGM

Saya membuat semacam solusi ... Saya telah memberi di mana skor bertambah (Anda selalu mendapatkan skor +1). Pertama, saya mulai menghitung dari num acak (misalkan 14) dan ketika saya menampilkan skor, hanya menunjukkan skor var minus 14. Ini terjadi jika cracker mencari contoh untuk 20, mereka tidak akan menemukannya (itu akan menjadi 34 dalam memori). Kedua, karena saya tahu apa yang harus menjadi titik berikutnya ... Saya menggunakan perpustakaan Adobe crypto, untuk membuat hash dari apa yang selanjutnya --- harus. Ketika saya harus menambah skor, saya memeriksa apakah hash dari skor yang meningkat sama dengan hash yang seharusnya. Jika cracker telah mengubah titik-titik dalam memori, hash tidak sama. Saya melakukan beberapa verifikasi sisi server dan ketika saya mendapat poin berbeda dari game dan dari PHP, saya tahu bahwa ada kecurangan yang terlibat. Ini adalah potongan kode saya (saya menggunakan kelas Adobe Crypto libraty MD5 dan garam kriptografi acak. CallPhp () adalah validasi sisi server saya)

private function addPoint(event:Event = null):void{
            trace("expectedHash: " + expectedHash + "  || new hash: " + MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt) );
            if(expectedHash == MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt)){
                SCORES +=POINT;
                callPhp();
                expectedHash = MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt);
            } else {
                //trace("cheat engine usage");
            }
        }

Menggunakan teknik ini + SWF obfustication, saya bisa menghentikan cracker. Juga, ketika saya mengirim skor ke sisi server, saya menggunakan fungsi enkripsi/dekripsi kecil saya sendiri. Sesuatu seperti ini (kode sisi server tidak termasuk, tetapi Anda dapat melihat algoritme dan menuliskannya dalam PHP):

package  {

    import bassta.utils.Hash;

    public class ScoresEncoder {

        private static var ranChars:Array;
        private static var charsTable:Hash;

        public function ScoresEncoder() {

        }

        public static function init():void{

            ranChars = String("qwertyuiopasdfghjklzxcvbnm").split("")

            charsTable = new Hash({
                "0": "x",
                "1": "f",
                "2": "q",
                "3": "z",
                "4": "a",
                "5": "o",
                "6": "n",
                "7": "p",
                "8": "w",
                "9": "y"

            });

        }

        public static function encodeScore(_s:Number):String{

            var _fin:String = "";

            var scores:String = addLeadingZeros(_s);
            for(var i:uint = 0; i< scores.length; i++){
                //trace( scores.charAt(i) + " - > " + charsTable[ scores.charAt(i) ] );
                _fin += charsTable[ scores.charAt(i) ];
            }

            return _fin;

        }

        public static function decodeScore(_s:String):String{

            var _fin:String = "";

            var decoded:String = _s;

            for(var i:uint = 0; i< decoded.length; i++){
                //trace( decoded.charAt(i) + " - > "  + charsTable.getKey( decoded.charAt(i) ) );
                _fin += charsTable.getKey( decoded.charAt(i) );
            }

            return _fin;

        }

        public static function encodeScoreRand(_s:Number):String{
            var _fin:String = "";

            _fin += generateRandomChars(10) + encodeScore(_s) + generateRandomChars(3)

            return _fin;
        }

        public static function decodeScoreRand(_s:String):Number{

            var decodedString:String = _s;
            var decoded:Number;

            decodedString = decodedString.substring(10,13);         
            decodedString = decodeScore(decodedString);

            decoded = Number(decodedString);

            return decoded;
        }

        public static function generateRandomChars(_length:Number):String{

            var newRandChars:String = "";

            for(var i:uint = 0; i< _length; i++){
                newRandChars+= ranChars[ Math.ceil( Math.random()*ranChars.length-1 )];
            }

            return newRandChars;
        }

        private static function addLeadingZeros(_s:Number):String{

            var _fin:String;

            if(_s < 10 ){
                 _fin = "00" + _s.toString();
            }

            if(_s >= 10 && _s < 99 ) {
                 _fin = "0" + _s.toString();
            }

            if(_s >= 100 ) {
                _fin = _s.toString();
            }           

            return _fin;
        }


    }//end
}

Lalu saya mengirim variabel di antara dengan vars palsu lainnya dan itu hanya hilang di antara cara ... Ini banyak pekerjaan untuk hanya permainan flash kecil, tetapi di mana hadiah terlibat beberapa orang hanya menjadi serakah. Jika Anda butuh bantuan, tuliskan saya PM.

Ceria, Ico

Dalam jawaban yang diterima, tqbf menyebutkan bahwa Anda hanya dapat melakukan pencarian memori untuk variabel skor ("Skor saya 666 jadi saya mencari angka 666 dalam memori").

Ada cara untuk mengatasi ini. Saya memiliki kelas di sini: http://divillysausages.com/blog/safenumber_and_safeint

Pada dasarnya, Anda memiliki objek untuk menyimpan skor Anda. Dalam setter itu mengalikan nilai yang Anda berikan dengan angka acak (+ dan -), dan dalam pengambil Anda membagi nilai yang disimpan oleh multiplikator acak untuk mendapatkan yang asli kembali. Ini sederhana, tetapi membantu menghentikan pencarian memori.

Juga, lihat video dari beberapa orang di belakang mesin PushButton yang berbicara tentang beberapa cara berbeda untuk memerangi peretasan: http://zaa.tv/2010/12/the-art-of- hacking-flash-games / . Mereka adalah inspirasi di belakang kelas.

4
divillysausages

Anda tidak dapat mempercayai data apa pun yang dikembalikan klien. Validasi perlu dilakukan di sisi server. Saya bukan pengembang game, tetapi saya membuat perangkat lunak bisnis. Dalam kedua kasus uang dapat terlibat dan orang-orang akan melanggar teknik kebingungan sisi klien.

Mungkin mengirim data kembali ke server secara berkala dan melakukan validasi. Jangan fokus pada kode klien, bahkan jika itu adalah tempat tinggal aplikasi Anda.

3
zeller

Enkripsi menggunakan kunci reversibel (pribadi) yang dikenal akan menjadi metode paling sederhana. Saya tidak sepenuhnya pada AS jadi saya tidak yakin apa jenis penyedia enkripsi yang ada.

Tapi Anda bisa memasukkan variabel seperti panjang game (terenkripsi, lagi) dan jumlah klik.

Semua hal seperti ini dapat direkayasa balik jadi pertimbangkan untuk membuang banyak data sampah untuk membuang orang dari aroma.

Sunting: Ini mungkin layak dicorok dalam beberapa sesi PHP juga. Mulai sesi ketika mereka mengklik mulai permainan dan (seperti komentar di posting ini) mencatat waktu. Ketika mereka mengirimkan skor Anda dapat memeriksa apakah mereka benar-benar memiliki permainan terbuka dan mereka tidak mengirimkan skor terlalu cepat atau terlalu besar.

Mungkin perlu dilakukan skalar untuk melihat berapa skor maksimum per detik/menit permainan.

Tidak satu pun dari hal-hal ini yang tidak dapat dihilangkan tetapi akan membantu memiliki beberapa logika tidak dalam Flash di mana orang dapat melihatnya.

3
Oli

Dalam pengalaman saya, ini lebih baik didekati sebagai masalah rekayasa sosial daripada masalah pemrograman. Alih-alih berfokus pada membuatnya mustahil untuk menipu, fokuslah untuk membuatnya membosankan dengan menghapus insentif untuk menipu. Misalnya, jika insentif utama adalah skor tinggi yang terlihat secara publik, cukup menunda kapan skor tinggi ditampilkan dapat secara signifikan mengurangi kecurangan dengan menghapus loop umpan balik positif untuk curang.

3
Scott Reynen

Anda berbicara tentang apa yang disebut masalah "kepercayaan klien". Karena klien (dalam bentuk tunai ini, SWF berjalan di browser) sedang melakukan sesuatu yang dirancang untuk dilakukan. Simpan skor tinggi.

Masalahnya adalah Anda ingin memastikan bahwa permintaan "simpan skor" berasal dari film flash Anda, dan bukan permintaan HTTP sewenang-wenang. Solusi yang mungkin untuk ini adalah menyandikan token yang dihasilkan oleh server ke SWF pada saat permintaan (menggunakan flasme ) yang harus menyertai permintaan untuk menyimpan skor tinggi. Setelah server menyimpan skor itu, token telah kedaluwarsa dan tidak dapat lagi digunakan untuk permintaan.

Kelemahan dari ini adalah bahwa pengguna hanya akan dapat mengirimkan satu skor tinggi per beban film flash - Anda harus memaksa mereka untuk menyegarkan/memuat ulang SWF sebelum mereka dapat bermain lagi untuk skor baru.

2
Peter Bailey

Cara mod arcade populer yang baru melakukannya adalah mengirimkan data dari flash ke php, kembali ke flash (atau memuatnya kembali), lalu kembali ke php. Hal ini memungkinkan Anda untuk melakukan apa pun yang Anda ingin membandingkan data juga memotong posting data/dekripsi hacks dan sejenisnya. Salah satu caranya adalah dengan menetapkan 2 nilai acak dari php ke dalam flash (yang Anda tidak bisa ambil atau lihat bahkan jika menjalankan grabber data flash realtime), menggunakan rumus matematika untuk menambahkan skor dengan nilai acak lalu memeriksanya menggunakan rumus yang sama untuk membalikkannya untuk melihat apakah skor cocok dengan itu ketika akhirnya pergi ke php di akhir. Nilai-nilai acak ini tidak pernah terlihat juga karena juga kali transaksi berlangsung dan jika lebih dari beberapa detik maka itu juga menandainya sebagai curang karena menganggap Anda telah menghentikan pengiriman untuk mencoba mencari tahu nilai-nilai acak atau menjalankan angka melalui beberapa jenis sandi untuk mengembalikan nilai acak yang memungkinkan untuk dibandingkan dengan nilai skor.

Ini sepertinya solusi yang cukup bagus jika Anda bertanya kepada saya, apakah ada yang melihat masalah dengan menggunakan metode ini? Atau kemungkinan cara mengatasinya?

2
Vaughn

Saya pikir cara paling sederhana adalah dengan membuat panggilan ke fungsi seperti RegisterScore (skor) setiap kali game mendaftarkan skor untuk ditambahkan dan kemudian menyandikannya, mengemasnya dan mengirimkannya ke skrip php sebagai string. Script php akan tahu cara mendekode dengan benar. Ini akan menghentikan semua panggilan langsung ke skrip php karena setiap upaya untuk memaksa skor akan menghasilkan kesalahan dekompresi.

2
mathieu landry

Setiap kali sistem skor tinggi Anda didasarkan pada kenyataan bahwa aplikasi Flash mengirim data skor tinggi tidak terenkripsi/tidak ditandatangani melalui jaringan, yang dapat dicegat dan dimanipulasi/diputar ulang. Jawabannya mengikuti dari itu: mengenkripsi (dengan sopan!) Atau secara kriptografis menandatangani data skor tinggi. Ini, setidaknya, membuat lebih sulit bagi orang untuk memecahkan sistem skor tinggi Anda karena mereka perlu mengekstrak kunci rahasia dari file SWF Anda. Banyak orang mungkin akan menyerah di sana. Di sisi lain, yang diperlukan adalah orang yang sendirian untuk mengekstrak kunci dan mempostingnya di suatu tempat.

Solusi nyata melibatkan lebih banyak komunikasi antara aplikasi Flash dan database highscore sehingga yang terakhir dapat memverifikasi bahwa skor yang diberikan agak realistis. Ini mungkin rumit tergantung pada jenis gim yang Anda miliki.

2
Jan Krüger

Tidak ada cara untuk membuatnya benar-benar tidak dapat dibongkar, karena mudah untuk mendekompilasi SWF, dan peretas pengembang yang terampil kemudian dapat melacak kode Anda dan mencari cara untuk mem-bypass sistem terenkripsi yang mungkin Anda gunakan.

Jika Anda hanya ingin menghentikan kecurangan anak-anak melalui penggunaan alat sederhana seperti TamperData, maka Anda dapat membuat kunci enkripsi yang Anda berikan ke SWF saat startup. Kemudian gunakan sesuatu seperti http://code.google.com/p/as3crypto/ untuk mengenkripsi skor tinggi sebelum meneruskannya kembali ke kode PHP. Kemudian dekripsi itu di ujung server sebelum menyimpannya di database.

2
David Arno

Saya biasanya memasukkan "data hantu" dari sesi permainan dengan entri highscore. Jadi jika saya membuat game balapan, saya memasukkan data replay. Anda sudah sering memiliki data replay untuk fungsi replay atau fungsi balap hantu (bermain melawan balapan terakhir Anda, atau bermain melawan hantu pria # 14 di papan peringkat).

Memeriksa ini adalah pekerjaan yang sangat manual, tetapi jika tujuannya adalah untuk memverifikasi apakah 10 entri teratas dalam kontes adalah sah, ini dapat menjadi tambahan yang berguna untuk gudang tindakan keamanan yang telah ditunjukkan oleh orang lain.

Jika tujuannya adalah untuk menjaga daftar skor tinggi online sampai akhir waktu tanpa ada yang harus melihatnya, ini tidak akan membawa Anda banyak.

2
Lucas Meijer

Hanya dimungkinkan dengan menjaga semua logika game di sisi-server yang juga menyimpan skor secara internal tanpa sepengetahuan pengguna. Untuk alasan ekonomi dan ilmiah, umat manusia tidak dapat menerapkan teori ini untuk semua jenis game kecuali turn-based. Untuk mis. menjaga fisika di sisi server adalah komputasi mahal dan sulit untuk mendapatkan responsif seperti kecepatan tangan. Bahkan mungkin, saat bermain catur siapa pun dapat mencocokkan gameplay catur AI dengan lawan. Karenanya, lebih baik game multipemain juga harus mengandung kreativitas sesuai permintaan.

2
placeohlder

Sangat tidak mungkin untuk mencapai apa yang Anda inginkan. Internal dari aplikasi Flash selalu dapat diakses sebagian, terutama ketika Anda tahu cara menggunakan hal-hal seperti CheatEngine , yang berarti tidak peduli seberapa aman situs web Anda dan browser <-> komunikasi server, masih akan tetap relatif mudah diatasi.

1
Mark Webster

Mungkin ide yang baik untuk berkomunikasi dengan backend via AMFPHP . Itu harus mencegah setidaknya yang malas dari mencoba untuk Mendorong hasil melalui konsol browser.

1
m1gu3l