Cihaz Güvenliği API'si, oyununuza katılan her oyuncunun cihazına ne kadar güvenebileceğinizi size bildirir. Bir oyuncu katıldığında, Roblox cihazlarının güvenilir olup olmadığını kontrol eder ve sonucu size cihaz güven düzeyi olarak verir. Bu kontrol, bir oyuncu katıldıktan sonra istismarları tespit eden yerleşik Roblox anti-hile sisteminin üzerine eklenen isteğe bağlı bir koruma katmanıdır.
Roblox, cihaz güven düzeyine dayanarak herhangi bir işlem yapmaz. Bunun oyununuz için ne anlama geldiğine siz karar verirsiniz. Örneğin, benzer güven düzeyine sahip oyuncuları bir araya getirebilir, ticaret gibi hassas özellikleri yalnızca güvenilir cihazlara sınırlayabilir veya kontrolü geçemeyen oyuncuları reddedebilirsiniz.
Cihaz Güvenliği API'si, IntegrityService.EvaluatePlayerDeviceTrust geri çağrısı ve Player.DeviceTrustLevel özelliğinden oluşur. Bunu betiklerinizde kullanmaya başlamak için güven düzeyini okuyun.
Cihaz güveni, güvenlik ve hile azaltma taktikleri içindeki taktikleri tamamlar, bunların yerini almaz.
Cihaz güven düzeyleri
Bir oyuncunun cihaz güven düzeyi aşağıdaki Enum.PlayerDeviceTrustLevel değerlerinden biridir:
| Düzey | Anlam |
|---|---|
| Pending | Roblox hala cihazı kontrol ediyor. Her oyuncu bu düzeyde başlar. |
| Unknown | Oyuncu desteklenmeyen bir platformda veya Roblox tarafında bir hata oluştu. Roblox, cihazın güvenilir olup olmadığını belirleyemez, bu nedenle güvenilir veya güvenilir olmayabilir. |
| None | Cihaz kontrolü geçemedi veya oyuncu doğrulanamayan ve genellikle hile için kullanılan bir platformda. |
| Standard | Cihaz bazı kontrolleri geçti, ancak hepsini geçemedi. |
| Full | Cihaz her kontrolü geçti. |
Desteklenen platformlar
Roblox, cihaz güvenini aşağıdaki platformlarda kontrol eder:
| Platform | Durum | Bildirilen güven düzeyi |
|---|---|---|
| Android | Destekleniyor | None, Standard veya Full |
| Chromebook | Destekleniyor | None, Standard veya Full |
| Meta Quest | Destekleniyor | None, Standard veya Full |
| Web tarayıcı | Doğrulanamıyor | None |
| iOS | Çok yakında | Unknown |
| macOS | Çok yakında | Unknown |
| Windows | Çok yakında | Unknown |
| Xbox | Çok yakında | Unknown |
| PlayStation | Çok yakında | Unknown |
Roblox bir platformu desteklemediği sürece, o platformdaki oyuncular Unknown bildirir.
Desteklenen bir platformda, bir cihazın ulaşabileceği güven düzeyi aynı zamanda donanımına da bağlıdır. Örneğin, her Android cihazı Roblox'un kullandığı kontrolleri desteklemez, bu nedenle bazı cihazlar değiştirilmemiş olsalar bile Standard veya Full düzeyine ulaşamazlar. Bilinen desteklenen cihazların listesi için Yardım Merkezi sayfasına bakın.
Nasıl çalışır
Bir oyuncu oyununuza katıldığında, Roblox cihazlarından gelen donanım sinyallerini kullanarak aşağıdakileri doğrular:
- Cihaz fiziksel bir cihazdır ve bir emülatör değildir.
- İşletim sistemi değiştirilmemiştir, örneğin cihaz köklenmemiştir.
- Roblox uygulaması değiştirilmemiştir.
Bu kontrollerden, Roblox oyuncu için bir cihaz güven düzeyi hesaplar. Sisteminin etkinliğini korumak için, Roblox değerlendirdiği belirli sinyalleri yayınlamaz.
Kontrol, oyuncu katılırken arka planda çalışır, bu nedenle yüklemeyi geciktirmez. Oyuncular güven düzeyleri mevcut olmadan oynamaya başlayabilir, bu nedenle bir oyuncuyu güvenilir olmayan biri olarak değerlendirin. Ayrıntılar için güven düzeyini okuyun.
Cihaz güven düzeyi, cihazı tanımlar, oyuncuyu veya hesaplarını değil. Bir oyuncunun hile yapıp yapmadığını söylemez. Cihazlarında hile yapmanın ne kadar zor olduğunu belirtir. Bunun yerine hesabı kontrol etmek için Player:IsVerified() kullanın.
Meşru oyuncular üzerindeki etkisi
Hiçbir cihaz kontrolü mükemmel değildir. Hile yapma niyeti olmayan bazı oyuncular hala düşük bir güven düzeyine ulaşır. Bu oyuncular iki gruba ayrılır.
Cihazlarını düzeltebilen oyuncular
Bazı cihazlar kontrolleri geçme kapasitesine sahiptir, ancak ayarları yapılmamıştır; örneğin, eski bir işletim sistemine sahip bir cihaz, köklenmiş bir cihaz veya değiştirilmiş bir Roblox uygulaması çalıştıran bir cihaz. Bu oyuncular genellikle cihazlarını güncelleyerek, Roblox'u resmi bir uygulama mağazasından yeniden yükleyerek veya cihazlarını orijinal durumuna döndürerek güven düzeylerini artırabilirler. Etkilenen oyuncuları sorun giderme adımları için Yardım Merkezi'ne yönlendirebilirsiniz.
Cihazlarını düzeltemeyen oyuncular
Diğer oyuncular, bu kontrollerin dayandığı donanımı desteklemeyen eski cihazlar kullanır. Bu oyuncular, o cihazda güven düzeylerini artıramazlar ve yalnızca daha yeni, desteklenen bir cihaza geçerek daha yüksek bir düzeye ulaşabilirler. Daha fazla bilgi için desteklenen platformlar bölümüne bakın.
Reddedilen bir oyuncunun gördükleri
Eğer oyununuz bir oyuncuyu güven düzeyine dayanarak reddederse, oyuncu bağlantısı kesilir ve bir mesaj görür. Bu mesajı kendiniz yazabilirsiniz, örneğin oyuncuları hala oynayabilecekleri bir moda yönlendirmek için. Eğer yazmazsanız, Roblox, oyuncunun neden katılamadığını ve cihazlarını nasıl düzeltebileceklerini açıklayan varsayılan bir mesaj gösterir.
Uygulama
Etkisini tahmin etme
Cihaz güveni ile ilgili bir işlem yapmadan önce, her güven düzeyinin kaç oyuncunuzu kapsadığını kontrol edin. Anti-hile sayfası, Creator Hub'da günlük aktif kullanıcılarınızın, oyun sürenizin ve desteklenen platformlardaki gelirinizin cihaz güven düzeyine göre nasıl dağıldığını tahmin eder. Bunu görüntülemek için oyun sahibi olmanız veya deneyimler için analizleri görüntüleme iznine sahip olmanız gerekir.
- Creator Hub'daki Yaratımlar sayfanıza gidin ve oyununuzu seçin.
- Sol menüde Güvenlik'i seçin, ardından Anti-hile'yi seçin.
Bir politika seçin
Politikanız, oyununuzun her cihaz güven düzeyine nasıl yanıt vereceğidir. Birini seçmek için:
- Unknown'ın oyununuz için ne anlama geldiğine karar verin. Unknown düzeyindeki oyuncuları güvenilir cihazlardaki oyuncular gibi mi, None düzeyindeki oyuncular gibi mi yoksa oyununuzun farklı bölümlerinde farklı mı ele alacağınıza siz karar verirsiniz.
- Etkisini kontrol edin. Creator Hub'daki Anti-hile sayfasını gözden geçirerek oyuncularınızın güven düzeyine göre nasıl dağıldığını görün. Daha fazla bilgi için etkisini tahmin etme bölümüne bakın.
- Her düzeye nasıl yanıt vereceğinizi seçin. Aşağıdaki yanıtlar en azdan en çok rahatsız ediciye doğru sıralanmıştır ve bunları birleştirebilirsiniz:
- Oyuncuları güven düzeyine göre yönlendirin. Oyuncuları güven düzeylerine uygun yerler veya sunuculara gönderin; örneğin, herkes için bir rahat yer ve güvenilir cihazlar için bir sıralı yer. Her oyuncu hala oyununuzu oynayabilir. Örnek için oyuncuları güven düzeyine göre yönlendirin bölümüne bakın.
- Hassas özellikleri kısıtlayın. Ticaret gibi belirli bir özellik için daha yüksek bir güven düzeyi gerektirerek, herkesin oyununuzun geri kalanını oynamasına izin verin. Örnek için özellikleri güven düzeyine göre kapatın bölümüne bakın.
- Oyuncuları reddedin. Oyuncuları oyununuzdan tamamen uzaklaştırın. Sadece None düzeyindeki oyuncuları son çare olarak reddedin. Örnek için katılma sırasında oyuncuları reddedin bölümüne bakın.
Türüne göre önerilen politikalar
Aşağıdaki tablo, Roblox'taki yaygın türler için başlangıç politikası önerir. Bunu oyununuzun nasıl çalıştığına göre uyarlayın.
| Tür | Pending | Unknown | None | Standard | Full |
|---|---|---|---|---|---|
| Rekabetçi FPS | Sonuç hesaplanana kadar bekleyin | Sadece rahat | Sadece rahat | Rahat ve sıralı | Rahat ve sıralı |
| Savaş alanları veya dövüş | Sonuç hesaplanana kadar bekleyin | Ayrı sunucular | Ayrı sunucular | Güvenilir sunucular | Güvenilir sunucular |
| Yarış, liderlik tabloları ile | Sonuç hesaplanana kadar bekleyin | Liderlik tablolarından çıkar | Liderlik tablolarından çıkar | Liderlik tablolarında | Liderlik tablolarında |
| Ticaret buluşması | Sonuç hesaplanana kadar bekleyin | Ticaret yapabilir | Ticaret yapamaz | Ticaret yapabilir | Ticaret yapabilir |
| Boşta, AFK veya tycoon | Sonuç hesaplanana kadar bekleyin | AFK ödülleri kazanır | AFK ödülleri yok | AFK ödülleri kazanır | AFK ödülleri kazanır |
| Rol yapma veya sosyal buluşma | Sonuç hesaplanana kadar bekleyin | Tam erişim | Tam erişim | Tam erişim | Tam erişim |
Güven düzeyini okuyun
Cihaz Güvenliği API'sinin her kullanımı, bir oyuncunun güven düzeyini içeren Player.DeviceTrustLevel ile başlar. Oyununuzun bir karar vermesi gerektiğinde, bunu sunucuda okuyun; örneğin, bir oyuncu sıralı bir maça katılmak veya ticaret başlatmak istediğinde.
Özelliği okurken aşağıdakileri göz önünde bulundurun:
- Her oyuncu Pending düzeyinde başlar ve özellik, güven düzeyi mevcut olduğunda bir kez değişir. Roblox bir cihazı kontrol etmeyi tamamlayamazsa, özellik tüm oturum boyunca Pending olarak kalabilir. Her zaman Pending'i hassas özellikler için yeterince güvenilir olmayan biri olarak değerlendirin.
- Güven düzeyini sunucuda okuyun ve sunucunun her istemciye hangi özellikleri etkinleştireceğini veya devre dışı bırakacağını bildirmesini sağlayın; örneğin, o oyuncuya bir RemoteEvent ateşleyerek. Özelliği istemcide okumaktan kaçının. Sadece oyuncunun kendi istemcisi güven düzeyini okuyabilir, diğer tüm istemciler Pending görür ve istismarcılar istemcilerinin ne yaptığını değiştirebilir.
- Studio'da güven düzeyi her zaman Pending'dir. Ayrıntılar için mantığınızı test edin.
Güven düzeyini bekleyin
Oyununuza katılan bir oyuncunun güven düzeyine ihtiyacı olan bazı bölümler olabilir; örneğin, oyuncuları güven düzeylerine göre bir lobide gönderen eşleştirme. Bu durumda, Players.PlayerAdded içinde bir oyuncuyu bekletebilir ve geri çağırma çalıştığında devam edebilirsiniz.
Bu deseni yalnızca oyuncuları kabul etmek ve deneyimlerini ayarlamak için kullanın; örneğin, onları yönlendirmek veya özellikleri kapatmak için. Oyuncuları reddetmek için, IntegrityService.EvaluatePlayerDeviceTrust geri çağrısından Reject döndürün ve bu mantığı geri çağrıda tutun; katılma sırasında oyuncuları reddetme bölümünde açıklandığı gibi.
Aşağıdaki betik, PlayerAdded'in çalıştığı iş parçacığını saklar, coroutine.yield() ile bekletir ve geri çağrıdan task.defer() ile devam ettirir. Eğer oyuncu ayrılırsa veya MAX_WAIT_SECONDS'den sonra güven düzeyi mevcut değilse, betik iş parçacığını devam ettirir, böylece hiçbir oyuncu sonsuza kadar beklemez:
local IntegrityService = game:GetService("IntegrityService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
-- Bir oyuncuyu güven düzeyini beklemeyi durdurmadan önce ne kadar süre bekleteceğiniz
local MAX_WAIT_SECONDS = 10
-- Her oyuncunun güven düzeyini bekleyen iş parçacığı
local waitingThreads: { [Player]: thread } = {}
-- Oyuncunun bekleyen iş parçacığını devam ettirir, eğer varsa
local function release(player: Player, trustLevel: Enum.PlayerDeviceTrustLevel?)
local thread = waitingThreads[player]
if thread then
waitingThreads[player] = nil
task.defer(thread, trustLevel)
end
end
-- Oyuncunun güven düzeyi mevcut olana kadar bekler. Bekleme süresi dolarsa Pending döner
-- ve oyuncu önce ayrılırsa nil döner.
local function waitForTrustLevel(player: Player): Enum.PlayerDeviceTrustLevel?
-- Roblox, Studio'da cihazları kontrol etmez, bu nedenle oyun testleri sırasında oyuncuları bekletmeyin
if player.DeviceTrustLevel ~= Enum.PlayerDeviceTrustLevel.Pending or RunService:IsStudio() then
return player.DeviceTrustLevel
end
waitingThreads[player] = coroutine.running()
task.delay(MAX_WAIT_SECONDS, release, player, Enum.PlayerDeviceTrustLevel.Pending)
return coroutine.yield()
end
IntegrityService.EvaluatePlayerDeviceTrust = function(player, measures)
release(player, player.DeviceTrustLevel)
return { Action = Enum.PlayerDeviceTrustDecision.Accept }
end
Players.PlayerRemoving:Connect(function(player)
release(player, nil)
end)
Players.PlayerAdded:Connect(function(player)
local trustLevel = waitForTrustLevel(player)
if trustLevel == nil then
return
end
-- Oyuncunun oturumunu burada başlatın, örneğin güven düzeyine uygun bir lobide onlara göndererek
-- Pending'i güvenilir olmayan biri olarak değerlendirin.
print(player.Name, "güven düzeyi ile katıldı", trustLevel.Name)
end)Oyuncuları güven düzeyine göre yönlendirin
Oyuncuları reddetmek yerine, onları güven düzeylerine uygun bir yere gönderebilirsiniz. Örneğin, rekabetçi bir oyun, herkesin katılabileceği bir rahat başlangıç yerinde herkesi kabul edebilir ve yalnızca güven düzeyleri gereksinimlerinizi karşılayan oyuncuları ayrı bir sıralı yere gönderebilir.
Rahat yerde, bir oyuncuyu sıralı yere TeleportService:TeleportAsync() ile teleporte etmeden önce güven düzeyini kontrol edin. Bu betik, istemci arayüzünüzün bir oyuncu sıralı oynamak istediğinde ReplicatedStorage içinde JoinRanked adında bir RemoteEvent ateşlediğini varsayar:
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local TeleportService = game:GetService("TeleportService")
local RANKED_PLACE_ID = 12345678901234 -- Sıralı yerinizin ID'si ile değiştirin
local RANKED_TRUST_LEVELS = {
[Enum.PlayerDeviceTrustLevel.Standard] = true,
[Enum.PlayerDeviceTrustLevel.Full] = true,
}
local joinRankedEvent = ReplicatedStorage:WaitForChild("JoinRanked")
joinRankedEvent.OnServerEvent:Connect(function(player)
if not RANKED_TRUST_LEVELS[player.DeviceTrustLevel] then
-- Oyuncuya sıralı oyunun bu cihazda mevcut olmadığını bildirin
return
end
local success, result = pcall(function()
return TeleportService:TeleportAsync(RANKED_PLACE_ID, { player })
end)
if not success then
warn("Sıralı yere teleport işlemi başarısız oldu:", result)
end
end)Oyuncular, arkadaşlarına katılarak sıralı yere ulaşabilirler. Orada aynı politikayı uygulamak için, sıralı yerde IntegrityService.EvaluatePlayerDeviceTrust geri çağrısını atayın; katılma sırasında oyuncuları reddetme bölümünde açıklandığı gibi, gereksinimleri karşılamayan oyuncuları reddedin:
local IntegrityService = game:GetService("IntegrityService")
local RANKED_TRUST_LEVELS = {
[Enum.PlayerDeviceTrustLevel.Standard] = true,
[Enum.PlayerDeviceTrustLevel.Full] = true,
}
IntegrityService.EvaluatePlayerDeviceTrust = function(player, measures)
if RANKED_TRUST_LEVELS[player.DeviceTrustLevel] then
return { Action = Enum.PlayerDeviceTrustDecision.Accept }
end
return {
Action = Enum.PlayerDeviceTrustDecision.Reject,
Message = "Sıralı oyun bu cihazda mevcut değil. Hala rahat modda oynayabilirsiniz.",
}
endOyuncular, geri çağrı çalışmadan önce oynamaya başlayabilir, bu nedenle güven düzeyleri Pending olduğunda bir oyuncu için sıralı bir maçı başlatmayın. Oyuncuların doğrudan katılabilecekleri yerleri kontrol etmek için güvenli teleportasyonu yapılandırın bölümüne bakın.
Bu örnekler, Pending, Unknown ve None düzeyindeki oyuncuları sıralı oyundan dışarıda tutar. Eğer Unknown düzeyindeki oyunculara şans vermek isterseniz, her iki tabloya da Unknown ekleyin.
Özellikleri güven düzeyine göre kapatın
Herkesin oynamasına izin vermek ancak ticaret gibi hassas özellikleri kısıtlamak için, bir oyuncu özelliği kullanmaya çalıştığında sunucuda güven düzeyini kontrol edin. Aşağıdaki betik, yalnızca her iki oyuncunun da izin verilen bir güven düzeyine sahip olduğu durumlarda bir ticarete izin verir. İzin verilen düzeyleri bir tabloda listelemek, politikanızı tek bir yerde tutar:
local TRADE_TRUST_LEVELS = {
[Enum.PlayerDeviceTrustLevel.Unknown] = true,
[Enum.PlayerDeviceTrustLevel.Standard] = true,
[Enum.PlayerDeviceTrustLevel.Full] = true,
}
local function canTrade(player: Player): boolean
return TRADE_TRUST_LEVELS[player.DeviceTrustLevel] == true
end
local function tradeItem(sender: Player, receiver: Player, itemId: string): boolean
if not (canTrade(sender) and canTrade(receiver)) then
return false
end
-- Sunucuda öğeyi doğrulayın ve aktarın
return true
endBu örnek, Pending ve None düzeyindeki oyuncular için ticareti engeller ve Unknown düzeyindeki oyuncuların ticaret yapmasına izin verir. Unknown düzeyindeki oyuncular için ticareti de engellemek istiyorsanız, tablodan Unknown'ı kaldırın.
Hassas bir işlemden önce hesabı kontrol etmek için, güven düzeyini Player:IsVerified() ile birleştirin.
Katılma sırasında oyuncuları reddedin
Eğer oyuncuları yönlendirmek veya özellikleri kısıtlamak yeterli değilse, oyuncuları oyununuzdan reddedebilirsiniz. ServerScriptService içindeki bir Script'te IntegrityService.EvaluatePlayerDeviceTrust geri çağrısına bir işlev atayın. Roblox, bu işlevi her oyuncu için, güven düzeyi mevcut olduğunda hemen bir kez çağırır.
Örneğin, aşağıdaki betik, cihazları kontrolü geçemeyen oyuncuları reddeder ve Unknown düzeyindeki oyuncular da dahil olmak üzere diğer herkesi kabul eder:
local IntegrityService = game:GetService("IntegrityService")
IntegrityService.EvaluatePlayerDeviceTrust = function(player, measures)
if player.DeviceTrustLevel == Enum.PlayerDeviceTrustLevel.None then
return {
Action = Enum.PlayerDeviceTrustDecision.Reject,
Message = "Bu oyun cihazınızı doğrulayamıyor.",
}
end
return { Action = Enum.PlayerDeviceTrustDecision.Accept }
endGeri çağrıyı atarken aşağıdakileri göz önünde bulundurun:
- Geri çağrı yalnızca sunucuda çalışır. Bunu bir LocalScript'ten atayamazsınız.
- Her yerin bir geri çağrısı vardır. Eğer birden fazla kez atarsanız, son atama önceki atamaları değiştirir, bu nedenle bunu tek bir betikte atayın. Oyununuzdaki farklı yerler farklı geri çağrılar atayabilir.
- Geri çağrı, Players.PlayerAdded tetiklendiğinde çalışır, çünkü cihazı kontrol etmek zaman alır. Geri çağrı çalıştığında, Player.DeviceTrustLevel zaten oyuncunun güven düzeyini içerir.
- Geri çağrı, bir karar vermeden önce veri yüklemek için bekleyebilir. Oyuncu geri çağrı çalışırken oynamaya devam eder.
- Geri çağrı yaklaşık 10 saniye sonra zaman aşımına uğrar. Eğer bir karar vermek için bu süreden daha uzun sürerse, Roblox oyuncuyu kabul eder.
- Eğer oyuncu ayrılırsa veya betikleriniz onları kaldırırsa, güven düzeyi mevcut olmadan geri çağrı o oyuncu için çağrılmaz.
Bir karar döndürün
Aşağıdaki alanlarla bir tablo döndürün:
| Alan | Tür | Açıklama |
|---|---|---|
| Action | Enum.PlayerDeviceTrustDecision | Zorunlu. Accept, oyuncunun oyunda kalmasına izin verir. Reject, oyuncuyu bağlantıdan keser. |
| Message | string | İsteğe bağlı. Reddedilen bir oyuncunun gördüğü mesaj. Bunu atlarsanız, Roblox, oyuncunun cihazını nasıl düzeltebileceğini açıklayan varsayılan bir mesaj gösterir; bu, cihazlarının başarısız olduğu önlemlere dayanır. Roblox bu mesajı filtreler, eğer filtreleme başarısız olursa varsayılan mesajla değiştirir ve çok uzun olan mesajları kısaltır. |
Kodunuzda bir hata olması durumunda oyuncuları asla kilitlememek için, Roblox her durumda oyuncuyu kabul eder:
- Hiçbir betik geri çağrıyı atamaz.
- Geri çağrı nil, bir tablo olmayan bir değer veya geçerli bir Action içermeyen bir tablo dönerse.
- Geri çağrı bir hata fırlatır. Roblox, hatayı diğer betik hataları gibi raporlar.
Bireysel önlemlere yanıt verin
Geri çağrının ikinci argümanı measures, oyuncunun güven düzeyini açıklayan bir boolean tablosudur. false değeri, cihazın o önlemi geçemediği anlamına gelir.
| Önlem | Geçerken |
|---|---|
| IsPlatformVersionSecure | İşletim sistemi, Roblox'un güvenli kabul ettiği minimum sürümde veya üstündedir. |
| IsPlatformBootSecure | İşletim sistemi güvenli bir durumda başlatılmıştır. |
| IsAppSecure | Roblox uygulaması değiştirilmemiştir. |
Önlemleri kullanarak politikanızı geliştirin. Aşağıdaki betik, None düzeyindeki oyuncuları reddeder, ayrıca güvenli bir durumda başlamayan işletim sistemine sahip Standard düzeyindeki oyuncuları da reddeder ve diğer herkesi kabul eder:
local IntegrityService = game:GetService("IntegrityService")
IntegrityService.EvaluatePlayerDeviceTrust = function(player, measures)
local trustLevel = player.DeviceTrustLevel
local isRejected = trustLevel == Enum.PlayerDeviceTrustLevel.None
or (trustLevel == Enum.PlayerDeviceTrustLevel.Standard and not measures.IsPlatformBootSecure)
if isRejected then
return { Action = Enum.PlayerDeviceTrustDecision.Reject }
end
return { Action = Enum.PlayerDeviceTrustDecision.Accept }
endYaygın hatalar
Cihaz Güvenliği API'sini kullanırken aşağıdaki desenlerden kaçının:
- Güven düzeylerini sayılar olarak karşılaştırmak. Her güven düzeyinin bir Value'sı vardır, ancak değerlerin sıralaması bir cihaza ne kadar güvenebileceğinizi yansıtmaz. Unknown, None'dan önce gelir, bu nedenle bir oyuncunun düzeyinin None'dan büyük olduğunu kontrol eden bir kontrol, Unknown düzeyindeki her oyuncuyu da hariç tutar. Bunun yerine, izin verdiğiniz düzeyleri listeleyin; bu sayfadaki örneklerde olduğu gibi. Unknown düzeyindeki oyuncuları kabul etmek istiyorsanız, Unknown'ı açıkça dahil edin.
- Players.PlayerAdded'den oyuncuları reddetmek. PlayerAdded tetiklendiğinde, oyuncunun güven düzeyi genellikle henüz mevcut değildir, bu nedenle o noktada bir kontrol, cihazları güvenilir olan oyuncuları reddedebilir. Bunun yerine, IntegrityService.EvaluatePlayerDeviceTrust geri çağrısından Reject döndürün; bu, güven düzeyi mevcut olduğunda Roblox tarafından çağrılır. Eğer PlayerAdded içinde güven düzeyine ihtiyacınız varsa, güven düzeyini bekleyin bölümüne bakın.
- Geri çağrıda yavaş işlemler çalıştırmak. Geri çağrı bekleyebilir, ancak yaklaşık 10 saniye sonra zaman aşımına uğrar ve Roblox oyuncuyu kabul eder. Birkaç veri deposu okuması veya HTTP isteği, bu sınıra ulaşacak kadar uzun sürebilir, bu nedenle geri çağrıda bekleyen işlemleri minimumda tutun.
- Güven düzeyini istemcide okumak. Bir oyuncunun kendi istemcisi güven düzeyini okuyabilir, bu nedenle bir LocalScript içinde bir özelliği gösterip göstermeyeceğinize karar verebilirsiniz. İstismarcılar istemcilerini kontrol eder ve bu kontrolleri atlayabilir. Bunun yerine, güven düzeyini sunucuda okuyun ve istemciye hangi özellikleri etkinleştireceğini bildirin. İstemci tarafındaki değişiklikleri, sunucunun istemciye söylediklerine dayandırın ve her zaman eylem gerçekleşmeden önce güven düzeyini sunucuda tekrar kontrol edin.
- Önlemleri güven düzeyinin yerine kullanmak. Bir önlem, bir cihazda mevcut olmadığında da true olabilir, bu nedenle bir cihaz her önlemi geçebilirken tam olarak güvenilir olmayabilir. Her önlemi geçen bir cihazı Full olarak değerlendirmeyin. Öncelikle güven düzeyini kontrol edin ve yalnızca önlemleri, başarısız olan kontrolleri aramak için kullanın.
Mantığınızı test edin
Roblox, Studio'da cihazları kontrol etmez, bu nedenle oyun testleri sırasında cihaz güven düzeyi Pending olarak kalır ve geri çağrı çalışmaz. Betikleriniz Pending'i güvenilir olmayan biri olarak değerlendirdiğinden, güven düzeyine göre kapattığınız özellikler de oyun testleri sırasında kullanılamaz.
Bu özellikleri test etmek ve yine de politikanızı test etmek için, politikanızı güven düzeyini alan bir işlevde tutun. RunService:IsStudio() true döndüğünde, güven kontrolünü atlayın ve her güven düzeyi ile politikanızı çağırın. Aşağıdaki betik, özellikleri güven düzeyine göre kapatın bölümündeki ticaret örneği için bunu yapar:
local RunService = game:GetService("RunService")
local IS_STUDIO = RunService:IsStudio()
local TRADE_TRUST_LEVELS = {
[Enum.PlayerDeviceTrustLevel.Unknown] = true,
[Enum.PlayerDeviceTrustLevel.Standard] = true,
[Enum.PlayerDeviceTrustLevel.Full] = true,
}
local function isTradeAllowed(trustLevel: Enum.PlayerDeviceTrustLevel): boolean
return TRADE_TRUST_LEVELS[trustLevel] == true
end
-- Her ticaretten önce bunu sunucuda kontrol edin
local function canTrade(player: Player): boolean
-- Roblox, Studio'da cihazları kontrol etmez, bu nedenle oyun testleri sırasında ticarete izin verin
if IS_STUDIO then
return true
end
return isTradeAllowed(player.DeviceTrustLevel)
end
-- Studio'da, politikanızın her güven düzeyini nasıl ele aldığını yazdırın
if IS_STUDIO then
for _, trustLevel in Enum.PlayerDeviceTrustLevel:GetEnumItems() do
print(trustLevel.Name, isTradeAllowed(trustLevel))
end
endSınırlamalar
Cihaz güveni, hile yapmayı zorlaştırır, ancak bu tam bir çözüm değildir:
- Güvenli oyun tasarımının yerini almaz. İstemciden bildirilen pozisyonlar, puanlar veya para gibi zayıf sunucu tarafı doğrulamasına dayanan istismarlar, güvenilir cihazlarda da çalışır. Önemli eylemleri sunucuda doğrulayın; istemci-sunucu sınırını güvence altına alma bölümünde açıklandığı gibi.
- Hile yapmayı azaltır, ancak ortadan kaldırmaz. Hile geliştiricileri zamanla uyum sağlar, bu nedenle cihaz güvenini, sunucu tarafı tespiti ile birlikte savunmalarınızın bir katmanı olarak değerlendirin.
- Her platform desteklenmez. Ayrıntılar için desteklenen platformlar bölümüne bakın.