Roblox, bir dağıtık fiziksel simülasyon sistemi kullanır, bu da müşterilerin kontrolündeki nesnelerin fiziksel simülasyonunu sağlar, genellikle oyuncunun karakteri ve bağlantısız nesneleri yakındaki oyuncu. Ayrıca, üçüncü parti yazılımını kullanarak, kötü niyetli Lua kodlarını
Toplumsal olarak, bu bir yetenekli korsanın potansiyel olarak oyununuzda hile yapmak için kodu yürütmesi demektir, bunların arasında:
- Kendi karakterlerini dünyaetrafında ışınlatıyor.
- Güvenli olmayan RemoteEvents ı vurmak veya RemoteFunctions ı çağırmak gibi, özellikleri kazanmadan ödüller kazanmak için.
- Hızlı bir şekilde hareket etmesi için karakterlerinin WalkSpeed ile ayarlanmasını.
Sınırlı tasarım savunmaları uygulayarak ortak saldırıları yakalamak için, sunucunun herhangi bir yürürlükteki herhangi bir deneyim için son yetkili olduğundan dolayı, daha güvenilir sunucu-taraflı mitigasyon taktikleri uygulamanızı şiddetle tavsiye ederiz.
Savunma Tasarım Taktikleri
Temel tasarım kararları, bir kullanıcının başka bir kullanıcıyı öldürmesi için "ilk adım" güvenlik önlemleri olarak hizmet verebilir. Örneğin, başka oyuncuların öldürülmesi için puan alan oyunlarda, bir hacker birkaç bot oluşturabilir, bu nedenle hızla öldürilebilir puanlar için kullanıcıların y
Yaklaşım | Öngörülebilir Sonuç |
---|---|
Onları tespit etmeye çalışan kodu yazıp botları takip edin. | |
Yeni oluşturulan oyuncular için öldürme puanı kazanımlarını azalt veya kaldır. |
Savunma tasarımı açıkçası mükemmel veya kapsamlı bir çözüm değildir, ancak sunucu-taraflı mitigasyon ile birlikte geniş bir güvenlik yaklaşımına katkıda bulunabilir.
Sunucu-Taraflı Mitigasyon
Mümkün olduğunca çok, sunucu final verdict'ini "doğru" olan şey ve dünyanın mevcut durumunu içeriyor. Müşteriler, elbette, sunucuya değişiklik yapmasını veya bir aksiyonyapmasını isteyebilir, ancak sunucu doğrulayıp onaylayacak her bir değişikliği/eylemi
Belirli fiziksel işlemlerin istisnasına rağmen, değiştiricilerin veri modelineki değişiklikler, sunucuya kopyalanmaz, bu yüzden ana saldırı yolunun genellikle RemoteEvents ve RemoteFunctions ile ilgili ilan ettiğiniz şeyler aracılığıyla yapılır.
Uzaktan Çalıştırma Türü Geçerli Doğrulama
Bir saldırı yolu, bir hacker'ın RemoteEvents ve RemoteFunctions ile Class.RemoteFunction|RemoteFunctions arjelerinin argümanlarını yanlış yüklediğinde kodu sunucunun bu uzaktaki kulümsetmeleri hata yapmasına neden olabilir. Bazı senaryolarda, bu yüzden kodu sunucunun bu uzaktaki kul
Uzaktan etkinlikler/fonksiyonlar kullanırken, bu tür bir saldırıyı önlemek için sunucudaki typler kayıtlarını geçerli hale getirerek bu tür bir saldırıyı önleyebilirsiniz. Modül “t” , mevcut
StarterPlayerScripts'ta Yerel Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")local remoteFunction = ReplicatedStorage:WaitForChild("RemoteFunctionTest")-- İşlev çağrılırken bileşen rengini ve konumunu değiştirirlocal newPart = remoteFunction:InvokeServer(Color3.fromRGB(200, 0, 50), Vector3.new(0, 25, 0))if newPart thenprint("The server created the requested part:", newPart)elseif newPart == false thenprint("The server denied the request. No part was created.")end
ServerScriptService'deki Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local remoteFunction = ReplicatedStorage:WaitForChild("RemoteFunctionTest")
local t = require(ReplicatedStorage:WaitForChild("t"))
-- Gereksiz yüksek performans için önce tür geçerli kalıcı oluşturun
local createPartTypeValidator = t.tuple(t.instanceIsA("Player"), t.Color3, t.Vector3)
-- Geçmiş özellikleri kullanarak yeni bir parça oluşturun
local function createPart(player, partColor, partPosition)
-- Geçerli argümanları kontrol edin
if not createPartTypeValidator(player, partColor, partPosition) then
-- Burada tip kontrolü başarısızsa sessizce "yalan" döndür
-- Bir cooldown olmadan bir hata yükseltilebilir, bu da sunucuyu boğabilir
-- Onun yerine müşterilerin geri bildirimini sağlayın!
return false
end
print(player.Name .. " requested a new part")
local newPart = Instance.new("Part")
newPart.Color = partColor
newPart.Position = partPosition
newPart.Parent = workspace
return newPart
end
-- Uzaktaki "createPart()" çağrısına bağlayın
remoteFunction.OnServerInvoke = createPart
Veri Geçerliliki
Kötü niyetli kişilerin başlatabileceği bir başka saldırı, teknolojik olarak geçerli türleri göndermek ancak onları son derece büyük, uzun veya başka şekilde kötü biçimlendirmek. Örneğin, bir sunucunun uzunluğuna uyan pahalı bir işleme gerçekleştirmesi gerekirse, bir hacker inanılmaz büyük veya kötü biçim
Aynı şekilde, hem inf hem de NaN``Global.LuaGlobals.type() olarak 1> number1> ın, ancak her ikisi de bir hacker tarafından gönderilir ve doğru şekilde ele alınmazsa önemli sorunlar yaratabilir. Her ikisi de takip edilenişlevler aracılığıyla yanlış ele alın
local function isNaN(n: number): boolean
-- NaN asla kendisi ile eşit değildir
return n ~= n
end
local function isInf(n: number): boolean
-- Sayı -inf veya inf olabilir
return math.abs(n) == math.huge
end
Eksploiters'ın kullanabileceği başka yaygın bir saldırı, tables yerine bir Instance göndermektir. Kompleks yüksekleri, diğer bir nesne referansı olarak işlenebilir.
Örneğin, ücretsiz deneyim dükkanı sistemi ile bir şekilde, öğe verileri gibi fiyatlar NumberValue nesnelerde saklanır, bir kötüye kullanıcı tüm diğer kontrolleri etkisiz hale getirebilir, takip edilenyaparak:
StarterPlayerScripts'ta Yerel Kod
local ReplicatedStorage = game:GetService("ReplicatedStorage")local itemDataFolder = ReplicatedStorage:WaitForChild("ItemData")local buyItemEvent = ReplicatedStorage:WaitForChild("BuyItemEvent")local payload = {Name = "Ultra Blade",ClassName = "Folder",Parent = itemDataFolder,Price = {Name = "Price",ClassName = "NumberValue",Value = 0, -- Olumsuz değerler de kullanılabilir, böylece para birimi verilir ve alınmaz!},}-- Malicious yükleyiciyi sunucuya gönder (bu reddedilecek)print(buyItemEvent:InvokeServer(payload)) -- Çıkış "yanlış sağlanan öğe"-- Sunucuya gerçek bir öğe gönder (bu geçecek!)print(buyItemEvent:InvokeServer(itemDatafolder["Real Blade"])) -- Outputs "true" and remaining currency if purchase succeeds
ServerScriptService'deki Skript
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local itemDataFolder = ReplicatedStorage:WaitForChild("ItemData")
local buyItemEvent = ReplicatedStorage:WaitForChild("BuyItemEvent")
local function buyItem(player, item)
-- Geçmiş öğenin yanlış olup olmadığını ve öğe veri alanında olup olmadığını kontrol edin
if typeof(item) ~= "Instance" or not item:IsDescendantOf(itemDataFolder) then
return false, "Invalid item provided"
end
-- Sunucu, satın alma işlemini aşağıdaki örnek akışa dayanarak işlemeye devam edebilir
end
-- RemoteFunction'ın çağrısına "buyItem()" eşlemesi
buyItemEvent.OnServerInvoke = buyItem
Değer Geçerlendirmesi
Ayrıca türleri ve verileri doğruladıktan sonra, değerleri 2>geçen2> ve 5>Class.RemoteEvent|RemoteEvents5> ve 8>Class.RemoteFunction|RemoteFunctions8> sistemlerini, istenen konteynttte ge
Tecrübeli Dükkanı
Bir kullanıcı arayüzüne sahip bir deneyim dükkanı sistemi, örneğin bir "Satın Al" düğmesi olan bir ürün seçme menüsü gibi, düğmeye basıldığında bir RemoteFunction arayabilirsiniz. Ancak, satın alma isteğini gerektiren kullanıcının yeterli
Silah Hedeflenmesi
Savaş senaryoları, özellikle nişanlanma ve vurma doğrulaması aşamasında değerleri geçerli kılmayı gerektirir.
Bir oyun hayal edin, bir oyuncu bir lazer guruluğunu başka bir oyuncuya ateş edebilir. Klientin sunucuya söylediği gibi hasar vermek yerine, lazer guruluğunun kaynağını veya vurduğunu düşündüğü parçayı/pozisyonu göstermelidir. Sunucu sonra takip edilendoğrulayabilir:
oyuncubildiği pozisyon sunulanmasından bu sunulanma, sunucunun ve istemcisinin karakterinde yakındır. Sunucunun ve istemcisinin gecikme nedeniyle, ekstra hoşgörülme gerektiğini unutmayın.
vurulduğu pozisyon, sunucudaki parçaya vurulduğu pozisyonda oldukça yakındır.
Klientin rapor ettiği pozisyon ve Klientin rapor ettiği pozisyon arasında statik engeller yoktur. Bu kontrol, bir klientin duvarlar aracılığıyla atış yapmayı denemesi olmaz. Not olası geometrileri göz ardı etmek için bu sadece statik geometrileri kontrol etmelidir. Ayrıca , daha da fazlasını sunucu tarafından geçerli kılmak isteyebilirsiniz:
Oyuncunun silahını son kez ateşlediğinde izi takip et ve çok hızlı ateş etmediğinden emin ol.
Her oyuncunun mermi miktarını sunucuda izleyin ve bir silah saldırısını yürütebilen bir oyuncu olduğundan emin olun.
Eğer takımları veya bir "insanlar botlarına karşı" savaş sistemini uyguladıysanız, vurulan karakterin bir düşman olduğunu, takım arkadaşı değil olduğunu doğrulayın.
Canlı oyuncu olduğunu doğrula.
Senaryo yenilenmesi gibi bir etkinliğin etkisi altında değilken silah ve oyuncu durumunu sunucuda saklayın ve bir oyuncu silahının durumunu onaylayın.
Veri Deposu Manipülasyonu
Oyunları DataStoreService kullanarak oyuncu envanterkaydetmek için, korsanlar geçersiz veriler , ve daha karanlık yöntemleri kullanarak bir DataStore 'ı doğru bir şekilde kaydetmekten önlemek için kötüye kullanabilirler. Bu özellikle 1>item
Oyuncu verilerini etkileyen RemoteEvent veya RemoteFunction eylemlerinin herhangi biri işlem güvenliği açısından takip edilengereksinimlere uygun olup olmadığını garanti edin:
- Instance değerleri bir DataStore içine seri olarak yazılamaz ve başarısız olur. Bunu önlemek için tür geçerlilik doğrulamasını kullanın.
- DataStoresveri sınırları vardır. Uzunluğu istemli olmayan yapılardaki teller kontrol edilmelidir ve/veya sınırsız rastgele anahtarlar eklenemediğinden, bunu önlemek için mümkün olduğunca sınırlı rastgele anahtarlar eklenmelidir.
- Masa indeksleri NaN veya nil olabilir. Tüm tabloların geçtiği klien tarafından itilen ve tüm indekslerin geçerli olduğunu doğrulanması gerekir.
- DataStores sadece geçerli UTF-8 karakterleri kabul edebilir, bu yüzden kullanıcı tarafından sağlanan tüm yazılımların geçerliliğ
Uzaktan Hızlandırma
Bir istemci, sunucunuzu bir hesaplama olarak pahalı bir işlemi yapmak veya bir DataStoreService gibi sınırlı bir hizmete erişim sağlayarak sunucuyu tamamlayabilir, ancak operasyonun çok sık çağrılmasını önlemek için bir or
Hareket Geçerlilik Doğrulaması
Rekabetçi deneyimler için, sunucudaki oyuncu karakteri hareketlerini doğrulamak isteyebilirsiniz, böylece harita etrafında ışınlanmıyor veya kabul edilebilir hızda hareket etmiyorlar.
1 saniye arttırımlarında, karakterin yeni yerini daha önce kaydedilmiş bir yerle karşılaştırın.
Gerçek mesafeyi tolere edilebilir mesafeyle karşılaştırın ve aşağıdaki adımları izleyin:
- Tolerable bir Delta için, karakterin yeni konumunu bir sonraki artırılmış kontrol etiçin hazırlık olarak kaydedin.
- Beklenmedik veya dayanılmaz bir delta (potansiyel hız/ışınlanma gücü kötüye kullanma) için:
- Oyuncuya "yanlış olumlu" sonuçlanan aşırı sunucu gecikmesi veya diğer kötüye kullanma faktörlerinden kaynaklanan "suç sayısı" değerini artırır.Increment a separate "number of offenses" value for the oyuncu, versus penalizing them for a "false positive" resulting from extreme server latency or other non-exploit factors.
- Eğer 30-60 saniye boyunca bir dizi suç gerçekleşirse, Kick() oyunu tamamen terk eder; aksi takdirde, "suç sayısı" sayısını sıfırla. Not edin ki, bir oyuncuyu hile yaparak tekmelediğinde, "suç sayısı" sayısını izleyebilmeniz için en iyi u