Bu, Internet oyunları ve yarışmalarında klasik bir sorundur. Flash kodunuz bir oyunun skorunu belirlemek için kullanıcılarla birlikte çalışır. Ancak kullanıcılar güvenilir değildir ve Flash kodu kullanıcının bilgisayarında çalışır. SOL'sunuz. Bir saldırganın yüksek puanlar çıkarmasını önlemek için yapabileceğiniz hiçbir şey yoktur:
Flash mühendisliği tersine çevirmek düşündüğünüzden daha da kolaydır, çünkü bayt kodları iyi belgelenmiştir ve üst düzey bir dili (Actionscript) tanımlamaktadır; bir Flash oyun yayınladığınızda, ister kaynak kodunuzu yayınlıyorsunuz, ister bilmek ya da bilmemek.
Saldırganlar, Flash yorumlayıcısının çalışma zamanı belleğini kontrol eder, böylece programlanabilir bir hata ayıklayıcının nasıl kullanılacağını bilen herkes herhangi bir değişkeni (geçerli puan dahil) istediği zaman değiştirebilir veya programın kendisini değiştirebilir.
Sisteminize karşı mümkün olan en basit saldırı, oyun için HTTP trafiğini bir proxy üzerinden çalıştırmak, yüksek puan tasarrufunu yakalamak ve daha yüksek bir puanla tekrar oynatmaktır.
Her bir yüksek puanı kaydetmeyi oyunun tek bir örneğine bağlayarak bu saldırıyı engellemeye çalışabilirsiniz, örneğin oyun başlangıcında istemciye şifreli bir jeton göndererek:
hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))
(Aynı etkiye sahip bir oturum çerezi de kullanabilirsiniz).
Oyun kodu, bu jetonu yüksek puan tasarrufuyla sunucuya geri yansıtır. Ancak bir saldırgan yine de oyunu tekrar başlatabilir, bir jeton alabilir ve hemen bu jetonu tekrar oynatılan yüksek puanlı bir tasarrufa yapıştırabilir.
Bundan sonra sadece bir jeton veya oturum çerezi değil, aynı zamanda yüksek puan şifreleme oturum anahtarını da beslersiniz. Bu, Flash oyununa sabit kodlanmış bir anahtarla şifrelenmiş 128 bit AES anahtarı olacaktır:
hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))
Şimdi oyun yüksek puanı göndermeden önce, yüksek puan şifreleme oturumu anahtarının şifresini çözer, çünkü yüksek puan şifreleme-oturum-anahtarı-şifre çözme anahtarını Flash ikili koduna sabit olarak kodlamışsınızdır. Yüksek puanı, bu şifresi çözülmüş anahtarla ve yüksek puanın SHA1 karmasıyla şifrelersiniz:
hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))
Sunucudaki PHP kodu, isteğin geçerli bir oyun örneğinden geldiğinden emin olmak için jetonu kontrol eder, ardından yüksek skorun yüksek skorun SHA1'iyle eşleştiğinden emin olmak için şifrelenmiş yüksek skorun şifresini çözer (bu adımı atlarsanız) , şifre çözme sadece rastgele, muhtemelen çok yüksek, yüksek puanlar üretecektir).
Bu yüzden şimdi saldırgan Flash kodunuzu açar ve ağrılı bir başparmak gibi görünen AES kodunu hızlı bir şekilde bulur, ancak olmasa bile bir bellek araması ve bir izleyici ile 15 dakika içinde izlenecektir ("biliyorum bu oyun için puanım 666, bu yüzden bellekte 666 bulalım, o değere dokunan herhangi bir işlemi yakalayalım --- oh bak, yüksek puan şifreleme kodu! "). Oturum anahtarıyla saldırganın Flash kodunu çalıştırması bile gerekmez; bir oyun başlatma jetonu ve bir oturum anahtarı alır ve keyfi bir yüksek puan geri gönderebilir.
Şu anda çoğu geliştiricinin vazgeçtiği noktadasınız - saldırganlarla birkaç ay uğraşın veya şu şekilde yapın:
AES tuşlarını XOR işlemleriyle karıştırma
Anahtar bayt dizilerini, anahtarı hesaplayan işlevlerle değiştirme
İkili boyunca sahte anahtar şifrelemeleri ve yüksek puan ilanları saçılıyor.
Tüm bunlar çoğunlukla zaman kaybıdır. Söylemeye gerek yok, SSL de size yardımcı olmayacak; İki SSL uç noktasından biri kötü olduğunda SSL sizi koruyamaz.
Yüksek puan sahtekarlığını gerçekten azaltabilecek bazı şeyler şunlardır:
Oyunu oynamak, oturum açmak için oturum açma çerezi oluşturmak ve bir oturumda aynı oturumda birden fazla oyuna veya aynı kullanıcı için birden fazla eşzamanlı oturum açmasına izin vermemek.
Şimdiye kadar oynadığınız en kısa gerçek oyunlardan daha az süren oyun oturumlarından yüksek puanları reddedin (daha sofistike bir yaklaşım için, ortalama oyun süresinin altında 2 standart sapmadan daha az süren oyun oturumları için yüksek puanları "karantinaya almayı" deneyin. Oyun sürelerini sunucuda izlediğinizden emin olun.
Saldırganların oluşturdukları her giriş için makul görünümlü bir oyun "kağıt izi" üretmek zorunda kalmaları için, oyunu yalnızca bir veya iki kez oynamış girişlerden yüksek puanları reddedin veya karantinaya alın.
Oyun sırasında "Heartbeat" puanları, böylece sunucunuz bir oyunun ömrü boyunca skor büyümesini görür. Makul puan eğrilerini takip etmeyen yüksek puanları reddedin (örneğin, 0'dan 999999'a atlama).
Oyun sırasında "Anlık Görüntü" oyun durumu (örneğin, mühimmat miktarı, seviyedeki konum, vb.), Daha sonra kaydedilen ara puanlarla uzlaşabilirsiniz. Başlamak için bu verilerdeki anormallikleri tespit etmenize gerek yoktur; sadece toplamak zorundasınız ve sonra geri dönüp işler balık gibi görünüyorsa analiz edebilirsiniz.
Güvenlik denetimlerinizden birini geçemeyen kullanıcıların hesabını devre dışı bırakın (örneğin, doğrulamayı geçemeyen şifreli bir yüksek puan göndererek).
Burada sadece yüksek skor sahtekarlığını caydırdığınızı unutmayın. Orada hiçbir şey eğer önlemek için ne yapabilirim. Oyununuzda hatta para varsa, birisi sizin bulduğunuz herhangi bir sistemi yenecek. Amaç bu saldırıyı durdurmak değil ; saldırıyı oyunda gerçekten iyi olmak ve yenmekten daha pahalı hale getirmek.