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

212

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 dari 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 mengacaukan SWF dengan Amayeta SWF Encrypt, tetapi mereka semua akhirnya diretas.

Berkat tanggapan StackOverflow, saya sekarang 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 rasa saya dapat digunakan 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)

Iain
sumber
Anda harus memberi batas skor, tidak ada alasan mengapa Anda tidak bisa melakukannya, per level, secara total, dll ...
mpm
Tautan pertama tidak tersedia lagi
Mike

Jawaban:

415

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.

tqbf
sumber
23
Saya membuat komunitas permainan online, dan kami merancang seluruh sistem penghargaan kami untuk menghargai skor persentil ke-10 teratas, bukan hanya pencetak gol terbanyak dan itu berhasil dengan baik, jadi mencoba menghindari masalah juga membantu!
grapefrukt
1
Bagus! Singkatnya, kecuali permainan berjalan di server (atau setidaknya memiliki pemeriksaan kewarasan berjalan di server), Anda tidak dapat mencegah penyalahgunaan. Masalah yang sama dengan penembak multipemain: Jika klien dimodifikasi untuk menghasilkan pembidikan yang lebih baik, Anda tidak dapat mencegahnya dalam protokol jaringan.
Kerrek SB
3
Saya kira kita juga bisa mencatat semua tindakan pengguna dan memutar ulang mereka di server untuk memverifikasi / menentukan skor tinggi
I3ck
25

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.

Stephen Deken
sumber
2
Ini adalah teknik yang saya gunakan di masa lalu juga untuk sistem pemungutan suara. Tidak ada cara Anda dapat mencegah orang dari kecurangan, namun yang dapat Anda lakukan adalah mencatat perilaku mereka sehingga Anda dapat memeriksa apakah ada kecurangan. Untuk sistem pemilihan kami, kami biasa menyimpan prangko waktu dan alamat IP. [lanjutan]
Luke
1
Dengan begitu kita setidaknya bisa melihat pola perilaku curang dan mendiskualifikasi orang jika perlu. Kami telah menggunakannya dengan sukses beberapa kali.
Luke
19

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 dalam PHP backend dan flash frontend. Checksum 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 setiap serangan replay dari terjadi, beberapa jenis sistem tantangan-respon akan harus diciptakan, seperti berikut ini:

  1. Permainan 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 kriptografi dari nilai garam yang 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 satu menit mungkin.
  2. Game 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 sebelumnya untuk mempercayai hanya sertifikat yang ditandatangani oleh otoritas sertifikat tertentu yang Anda sendiri memiliki akses ke .

stormlash
sumber
11

Saya suka apa yang dikatakan tpqf, tetapi daripada menonaktifkan akun ketika kecurangan ditemukan, 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.

DGM
sumber
1
Masalah dengan pendekatan itu adalah bahwa cheat ini saling membual di papan pesan dll, sehingga tidak benar-benar menghalangi mereka.
Iain
7
Saya tidak setuju. Ini terdengar seperti pendekatan yang sangat cerdas.
bzlm
4

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- permainan / . Mereka adalah inspirasi di belakang kelas.

divillysausages
sumber
4

Saya membuat semacam solusi ... Saya telah memberi di mana skor bertambah (Anda selalu mendapatkan skor +1). Pertama, saya mulai menghitung dari num acak (katakanlah 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 seharusnya menjadi titik berikutnya ... Saya menggunakan perpustakaan adobe crypto, untuk membuat hash dari apa yang seharusnya menjadi titik selanjutnya. Ketika saya harus menambah skor, saya memeriksa apakah hash dari skor yang bertambah sama dengan hash yang seharusnya. Jika cracker telah mengubah titik di 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 obfustikasi, saya bisa menghentikan kerupuk. 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 lain 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

Chris Panayotoff
sumber
3

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 permainan (terenkripsi, lagi) dan jumlah klik.

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

Sunting: Mungkin ada baiknya juga membuang beberapa sesi PHP. Mulai sesi ketika mereka mengklik start game dan (seperti komentar di posting ini mengatakan) catat waktu. Ketika mereka mengirimkan skor, Anda dapat memeriksa apakah mereka benar-benar mendapatkan 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 untuk memiliki beberapa logika tidak dalam Flash di mana orang dapat melihatnya.

Oli
sumber
Siapa pun yang mengikuti pendekatan ini juga harus memasukkan waktu, dan memvalidasi waktu, jika tidak Anda rentan terhadap serangan replay.
Tom Ritter
3

Dalam pengalaman saya, ini lebih baik didekati sebagai masalah rekayasa sosial daripada masalah pemrograman. Daripada berfokus untuk membuatnya tidak mungkin 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.

Scott Reynen
sumber
12
Tapi itu juga menghilangkan umpan balik positif dari skor tinggi instan untuk pemain yang sebenarnya, sehingga Anda mengurangi kualitas permainan.
Chris Garrett
3

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.

zeller
sumber
2

Setiap kali sistem skor tinggi Anda didasarkan pada kenyataan bahwa aplikasi Flash mengirimkan 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.

Jan Kruger
sumber
2

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 kepada 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 di ujung server sebelum menyimpannya di database.

David Arno
sumber
2

Anda berbicara tentang apa yang disebut masalah "kepercayaan klien". Karena klien (dalam bentuk tunai ini, SWF berjalan di browser) sedang melakukan sesuatu yang memang dirancang untuk dilakukannya. 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.

Peter Bailey
sumber
2

Saya biasanya memasukkan "data hantu" dari sesi permainan dengan entri highscore. Jadi jika saya membuat game balap, 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 banyak membawa Anda.

Lucas Meijer
sumber
2

Cara mod arcade populer yang baru melakukannya adalah mengirimkan data dari flash ke php, kembali ke flash (atau memuatnya kembali), lalu kembali ke php. 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 itu '

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

Vaughn
sumber
Wireshark. Wireshark selalu menjadi lubang.
aehiilrs
ya, saya sudah mencoba metode yang tepat ini ... well ... entah bagaimana saya mendapatkan pengguna yang sah sedang login sebagai curang (fungsi ini bekerja sepanjang waktu di komputer saya, tetapi tidak bekerja pada beberapa komputer lain) ... jadi sekarang saya hanya diizinkan untuk menipu ... Saya mencatat orang yang tidak lulus cek di atas & Saya mencatat orang dengan skor sangat tinggi & kemudian secara manual menyalahgunakan mereka ... dengan membuat skor mereka * -1: P mereka biasanya menerima lelucon dengan baik.
Sigtran
1
"Salah satu caranya adalah dengan menetapkan 2 nilai acak dari php ke dalam flash (yang Anda tidak dapat ambil atau lihat bahkan jika menjalankan grabber data flash realtime)" - Tolong beri tahu saya, apakah ada cara untuk mengirimkan nilai dari php ke flash tanpa dipantau oleh pembakar atau alat lain?
mkto
2

Saya pikir cara paling sederhana adalah dengan melakukan 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 memaksakan skor akan menghasilkan kesalahan dekompresi.

Mathieu Landry
sumber
2

Itu hanya mungkin 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 permainan kecuali berbasis giliran. Untuk mis menjaga fisika di sisi server adalah komputasi mahal dan sulit untuk mendapatkan responsif sebagai kecepatan tangan. Bahkan mungkin, saat bermain catur siapa pun dapat mencocokkan gameplay catur AI dengan lawan. Karena itu, permainan multipemain yang lebih baik juga harus mengandung kreativitas sesuai permintaan.

yasc
sumber
1

Sangat tidak mungkin untuk mencapai apa yang Anda inginkan. Bagian 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 relatif mudah untuk diatasi.

Tandai Webster
sumber
1

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

m1gu3l
sumber