Sebelum menyelami taktik spesifik untuk mengembangkan dengan aman dan mencegah kecurangan, penting untuk memahami prinsip-prinsip dasar keamanan Roblox. Permainan yang aman dibangun di atas pola pikir yang mengantisipasi tindakan yang merugikan. Sebelum menulis satu baris kode pun, Anda harus menginternalisasi prinsip-prinsip dasar ini. Prinsip-prinsip ini harus memengaruhi setiap keputusan arsitektur dan desain yang Anda buat.
Jangan pernah percaya pada klien
Ini adalah prinsip dasar. Seorang penipu yang gigih memiliki kontrol penuh atas keadaan lokal dan lalu lintas jaringan mereka. Karena penipu memiliki tingkat kontrol ini, setiap langkah keamanan yang bergantung pada penegakan sisi klien pada akhirnya akan dilewati. Ini bukanlah batasan dari Roblox: ini adalah kenyataan mendasar dari arsitektur klien-server. Anggap setiap potongan data yang dikirim dari klien telah dimanipulasi, dipalsukan, atau dikirim dengan niat jahat. Ini termasuk kekuatan untuk:
- Mengkompilasi ulang setiap LocalScript yang direplikasi atau ModuleScript, bahkan jika mereka tidak pernah dijalankan di klien
- Mengambil kepemilikan jaringan dari karakter mereka dan bagian yang tidak terikat
- Memicu peristiwa yang diinisiasi klien seperti peristiwa Touched atau aktivasi ProximityPrompt pada jarak atau frekuensi apa pun
- Mengubah posisi pemain mereka, fisika, atau interaksi dengan dunia
- Memicu atau memanggil RemoteEvents dan RemoteFunctions pada frekuensi apa pun dengan argumen sewenang-wenang (selain argumen Pemain pertama)
- Mengubah apa pun di DataModel lokal mereka tanpa memicu peristiwa yang diharapkan
- Mengubah perilaku kode yang berjalan secara lokal secara sewenang-wenang
Karena hal ini, semua logika kritis harus divalidasi di sisi server atau dijalankan secara eksklusif di server. Konsekuensi dari kontrol ini dijelaskan secara rinci dalam Kepemilikan Jaringan, Validasi Gerakan, dan Eksploitasi Fisika dan Kontrol Akses dan Kerahasiaan.
Otoritas server
Server harus menjadi sumber kebenaran utama untuk semua status simulasi, aturan, kemajuan pemain, dan keputusan kritis. Peran klien adalah untuk merender dunia dan mengirimkan input pengguna ke server.
Peran server adalah untuk:
- Menerima input dari klien
- Memvalidasi bahwa tindakan yang diminta mungkin dan diperbolehkan
- Melaksanakan tindakan dan memperbarui status otoritatifnya
- Mereplikasi hasilnya ke semua klien yang relevan
Sebagai contoh, jika seorang pemain mengatakan "Saya ingin membeli Bloxy Cola", server harus mengetahui harga sebenarnya dari item tersebut, uang pemain, dan jarak fisik karakter pemain dari toko sebelum memvalidasi dan menyetujui transaksi. Sebisa mungkin, status yang akan divalidasi harus dipertahankan secara eksklusif oleh server dan bukan oleh klien. Dalam contoh ini, jika transaksi Bloxy Cola disetujui, server harus mengurangi harga Bloxy Cola dari uang pemain, namun, server tidak selalu dapat mengontrol karakter pemain.
Keamanan dengan desain
Integrasikan pertimbangan keamanan ke dalam desain permainan Anda sejak awal, daripada mencoba menambahkannya kemudian sebagai pemikiran setelahnya.
- Model ancaman setiap fitur baru. Untuk setiap fitur baru, tanyakan
- Bagaimana seorang penyerang dapat mengeksploitasi ini jika mereka memiliki kontrol penuh atas klien mereka?
- Jika klien dapat mengirimkan nilai apa pun untuk parameter apa pun yang digunakan dalam fitur, apa hasil terburuk yang mungkin terjadi?
- Apa yang terjadi jika fitur ini digunakan lebih dari 1.000 kali per detik? Apa laju maksimum di mana fitur ini harus digunakan?
- Dapatkah seorang penipu menggunakan ini untuk merusak pengalaman pemain lain?
- Berapa banyak sumber daya, dalam kasus terburuk, yang dapat digunakan fitur ini secara realistis?
- Apa informasi atau status internal minimum yang perlu saya ungkapkan untuk fitur ini?
- Bagilah tanggung jawab lebih awal. Simpan logika dan data di ServerScriptService sejak hari pertama. Jangan pernah menempatkannya di wadah yang direplikasi seperti ReplicatedStorage atau Workspace.