Tarayıcı için dolandırıcılık Javascript / HTML5 oyunu


35

Js / html5'te tek oyunculu bir rpg eylemi yapmak için girişimde bulunmayı planlıyorum ve hile yapmaktan kaçınmak istiyorum. % 100 korumaya ihtiyacım yok, çünkü çok oyunculu bir oyun olmayacak, ama bir koruma seviyesi istiyorum.

Peki küçültme ve şaşırtmanın ötesinde hangi stratejileri önerirsiniz?

Bazı sunucu tarafı kontrollerini basitleştirmek için uğraşmazdım, ancak tüm oyun durumumu sunucu tarafında tutan Diablo 3 yoluna gitmek istemiyorum.

Bir çeşit rpg olacağı için, değerlerinde ani değişiklikleri kontrol eden bir istatistik müfettişi yapma fikrine ulaştım, ancak bunun nasıl tutarlı ve güvenilir olabileceğinden emin değilim.

Değişkenler ve fonksiyonlar escopes hakkında ne? Mümkün olan her yerde daha küçük eskoplarla çalışmak daha güvenlidir, ancak bu çabaya değer mi?

Javascript'in bir sağlama toplamındaki gibi metnini kendi kendine incelemesi için yine de var mı?

Tarayıcıya özel çözümler var mı? Chrome'u yalnızca ilk inşaatlarda sınırlamak için uğraşmazdım.


Verileriniz nereye kaydedilir, verileriniz nasıl kaydedilir?
DogDog

Komik Diable 3 hakkında konuşmak, "Diablo 1 yolu" tam olarak, müşteriye güveniyordu. Bu nedenle ne olduğunu hatırlamak için çok gençseniz bir google arama yapın!
Valmond


Apoc, şu anda sadece bir konsept kanıtım var ve herhangi bir ısrar uygulamamıştım - ama ilk inşalarda ve / veya yerel depoda bir DB ısrarı uygulamayı planlıyorum; Evet, Valdmond Diablo payımı o zaman oynadım. Ancak rekabetçi bir çok oyunculu oyun veya tam işaretli bir AAA yapmıyorum. Bayt56, kodumu çalmakla ilgilenmiyorum (kim bir şekilde bu saçmalığı ister ki?)
Billy Ninja

maalesef, hacker / hileler konusunda gerçekten endişeleniyorsanız, diablo 3 yoluna gitmeniz gerekiyor
Noob Game Developer

Yanıtlar:


46

Kısa cevap, yapamayacağınız. Müşteri tarafından çalışan, özellikle kaynaktan çalışan herhangi bir şey, taktiklerinizi önemsiz bir şekilde yenmek için değiştirilebilir. Ani değişiklikleri aramak için bir müşteri tarafı denetleyicisi yerleştirirseniz, kullanıcı denetleyiciyi devre dışı bırakabilir.

İyi haber şu ki, tek oyunculu oyunlarda genellikle çok az hile yapıyor. Tek büyük istisna, oyuncuların YouTube üzerinden birbirleriyle rekabet ettiği Line Rider gibi büyük "youtube yüksek puanlı" toplulukları olan oyunlar.

Bunu hedefliyorsanız veya insanların oyunda hile yapabileceklerini kabul edemeyecek kadar inatçıysanız veya yüksek puanlar alıyorsanız (ki bu bir çok oyunculu oyun şeklidir) o zaman yapmanız gereken tek şey sunucu tarafı. . Evet, önemli olan her şey. Kullanıcıya puan vermeye çalışmak için hesaplama istemcisi tarafını bile tekrarlayamazsınız ve ardından sunucu ile 'doğrularsınız' çünkü kullanıcı kontrolü sadece devre dışı bırakıp kontrollerin yapılmasını sağlayan herhangi bir sistemi devre dışı bırakabilir.

Keşke buna daha iyi bir cevap olsaydı, ama olmadı.

Bununla birlikte, hile yapmayı biraz zorlaştırmak için yapabileceğiniz şeyler var. Ciddi kimsenin bunu yapmasını ve hile yapması için bir araç bırakmasını engellemeyecekler, ancak onları yavaşlatacak:

  • Kodunuzu okumayı zorlaştıracak JS'nizi küçültün ve gizleyin. Küçültme ve küçümseme sıkıntısı çekebilirsiniz ancak doğru değişken ve işlev adlarını veya yorumları asla geri alamazsınız.
  • Farklı bir dille değerleri pişirin. Bu durumda statik kurulum değişkenlerini işlemek için PHP veya diğer sunucu tarafı dilleri kullanabilirsiniz. Atlama mesafesinin her zaman 2 boşluk olması gerekiyorsa, normal olarak oynatıcı nesnesi için bir atlama mesafesi tanımlarsınız. PHP ile işlem yapmayın, böylece JS kaynağı kodun her yerine milyonlarca yerde sıvanmış 2s ile bitiyor. Bu, JS'nizi de hızlandırabilmenin mutlu yan etkisine sahiptir.
  • Bazı uygulamalarda, karışım konusunda uzmanlaşacaksınız ve JS'nizi her oyuncu için özel olarak bile oluşturabilirsiniz. Hile yapmayı önlemenin başka bir yolu. Her oyuncunun kodu bir şekilde farklıysa, bir araç setinin parçası olabilecek bir hile yazmak daha zordur.
  • Son olarak, oynatıcının kimliğine göre kaynağı kontrol edebilirsiniz. IP adreslerini ve / veya kullanıcı adlarını söyleyin. JS'nin oyuncuya özel sürümünün ne olacağını biliyorsunuz, bir sağlama toplamı hazırlayabilirsiniz ve diğer tarafta da aynı olmasını gerektirir. Herhangi bir müşteri tarafı JS'si gibi devre dışı bırakılması kolaydır, ancak bir kez daha bir araç takımı oluşturmayı biraz zorlaştırır.

Yani. Gördüğünüz gibi, muhtemelen bu rotaya gitmeye değmez. Bu zor. Yapması gereken çok aptalca kodlama uygulamaları gerektirir ve sonuçta yenilmesi oldukça kolaydır. Hile yapmamak için tüm hesaplamaları sunucu tarafında yapmanız gerekir. Ya da bırak gitsin ve aldatmanın olacağını kabul et.


Hat binici örneği, kullanıcının çizdiği haritayı yüklemesine ve puanı hesaplamasına izin vererek, sunucu tarafı yapmak için oldukça önemsizdir. Ancak oyun salonları gibi oyunların, sunucu tarafında puanları hesaplamak için kapsamlı bir çalışma yapmak mümkün değil.
orlp

@ nightcracker Haklısınız, ancak Line Rider gibi bir şey olsa bile, yalnızca oyun bittikten sonra kontrol ederseniz, video çekildi ve YouTubes zaten kopyalandı. Kullanıcı oyuna girdiğinde haritayı yüklemelisin, önemsiz olan yolu hesapla ve sonra onu geri gönder. Oyun yolu hesaplama yeteneğine sahip olmamalı. (Biz bu oyun değil kanıt, hile yapma konusunda söz varsa bu hile taraftarların anlayacağı gibi sadece basit yeterlidir..)
DampeS8N

14

Burada böyle bir soruyu zaten cevapladım ve bunu söylediğim için üzgünüm ama:

Bazı sunucu tarafı kontrollerini basitleştirmek için uğraşmazdım, ancak tüm oyun durumumu sunucu tarafında tutan Diablo 3 yoluna gitmek istemiyorum.

Burada söyleyebileceğin en kötü şey. "Hile karşıtı" bir motor yapmak istiyorsanız, bunu yapmanız gerekir. Sunucu tarafı çalışmasını kolaylaştırmak için istemci tarafı istediğiniz herhangi bir şey ekleyebilirsiniz, ancak müşteriye asla güvenmemelisiniz. Sahip olduğunuz tüm mantık en azından sunucu tarafında olmalıdır. İsterseniz istemci tarafında yeniden üretebilirsiniz, ancak hiçbir istemci tarafı yalnızca çözüm yapmaz.

Ve bu arada, programınızın zayıflığını bulmak istiyorsanız, şaşırtmayın, insanların kodunuzu görmesine izin verin ve "burada, bir sorun var" deyin.

Bu sizin için, kodunuz için, kullanıcılarınız ve topluluk için iyidir.


3
Sunucu yetkisi için +1, istemciye güvenmeye çalışırsanız işe yaramaz ...
Valmond

Müşteri tarafındaki şeylerin çoğaltılması tehlikelidir. Buna dikkat edin, çünkü her şey müşteri tarafından çoğaltılırsa, kullanıcı çekleri sunucu ile ayırarak hile yapabilir. Daha sonra oyunu oynayabilir, video kaydedebilir ve YouTube yıldızı olabilirler. Bu sadece bu oyunun oynanacağı tek oyunculu oyunlar için geçerlidir.
DampeS8N

Müşteri tarafı hakkında konuştuğumda, "hareket hesaplama", "çarpışma" vb. İçin. Çok oyunculu bir oyun için bile her iki taraf da yapılabilir. Sunucu tarafı hesaplamaları her zaman öncelikli olarak kabul edilmek zorundadır, ancak bu, sunucu tarafında gecikme olduğunda istemci tarafında da bulunmasına yardımcı olabilir. Ama "kontrol hile" mantığı olan her şey için, o zaman her şeyin sunucu tarafında olması gerektiğine katılıyorum.
dievardump

Evet, anladım. Ama ben projeyi boş zamanlarımda hobi olarak yapıyorum. Bu türden bir sunucu kontrolü yapmak, projenin karmaşıklığını bir hayli zorlaştıracak, onu kalıcı kılacaktı. Pekala, bunu bilerek projeye devam edeceğim ve eğer daha ciddi ve ciddi olmaya başlarsa, muhtemelen Node.js.
Billy Ninja

bu OP için daha uygun bir cevaptır
Noob Game Developer

3

Eh, başlamak için iyi bir yer Object.freeze işlevini kullanmaktır (nesne yamalarına karşı korumayı sağlayacak).

Bu "yeni özelliklerin eklenmesini engeller", "mevcut özelliklerin kaldırılmasını önler", "mevcut özelliklerin veya numaralandırılabilirliklerinin, yapılandırılabilirliklerinin veya yazılabilirliklerinin değiştirilmesini önler"; İç durumdaki herhangi bir değişiklik erişimciler tarafından yapılmalıdır. Aşağıdaki örnek krom üzerinde çalışıyor (firefox'ta çalışması gerekiyor, IE hakkında bilgim yok ama ...):

var b = {}
// Fill your object with whatever you want
b.a = "ewq"
// Freeze all changes
Object.freeze(b)
// Try to put new value. This wont throw any error, put wont work either, 
// as we shall see ...
b.b = "qwe"

// Values 
console.log(b.a); // outputs "eqw"
console.log(b.b); // outputs  undefined

5
Bu bile, yalnızca belirli bir dolandırıcıyı yavaşlatacak. Başka hiçbir şey kaynağı çalamazsa, kendi bilgisayarında barındırabilir ve dondurma kodunu kaldırabilir ve ardından yeni sayfanın eski olduğunu düşünerek tarayıcısını kandırmak için ana bilgisayar dosyasını kullanır ve sunucuyla yeniden bağlanır.
DampeS8N 20:12

@ DampeS8N Evet, sanırım haklısın.
fableal

OP'de dediğim gibi, sadece bir düzeyde koruma istiyorum .
Billy Ninja

Bu hiç yardımcı olmaz! Kullanıcı çalıştırılan ve Object.freeze = function(o) {};JS konsoluna giren ilk JS fonksiyonunda bir hata ayıklayıcı kesme noktası ayarlayabilir .
Philipp,

2

ne yazık ki, gerçekten kesmek / hileler konusunda endişe duyuyorsanız, diablo 3 yoluna gitmek zorunda. değilseniz, yapmanız gereken temel kontrolleri yapmanız ya da şiddetle tavsiye etmeniz gerekir.

  • çek satın al - Bir şey satın alırsam, yeterince altın almalıyım.
  • sellchecks - Bir şey satıyorsam, o malın envanter takas çeklerimde olması gerekir - satış silahıyla aynı
  • kontrol donatmak - Bir silahı donatıyorsam, ona sahip miyim / sahip miyim?
  • hasar kontrolleri - Bir şeye (düşman) saldırıyorsam, silahımın verebileceği maksimum hasardan daha fazla kazanamıyorum (burada müşterinin hangi silahı daha önce kullanması gerektiğini bilmesini beklememelisiniz)
  • işçiliği kontrolleri - Bir şey hazırlanmışsa, gerekli tüm bileşenlere / bileşenlere sahip miyim?

... ve bunun gibi

1 puan biraz yanıltıcıdır, kahramanın pozisyonudur, çünkü çok endişelenmiyorsunuz, bırakabilirsiniz, ancak bunu daha iyi yapmalısınız;

  • Place1 @ T1'deyim, Place2 T2'deyim, place1'den place2'ye seyahat etmek için en az ne kadar zaman harcar ve benim T2 - T1 ile eşleşir. Bunun harita eşlemesini harita boyutuna bağlı olarak küçükten büyüğe yapabilirsiniz. NPC - patron, NPC - düşman spawn alanı gibi en azından belli başlı alanların listesi olmalı (tam olarak kesin yer değil)

Bu yardımcı olur umarım, zor geliyor ama gerçek çalışma oyunları yapmayı öğrenmek gerekir


Mükemmel cevap! Sunucu kontrolünün nasıl yapılacağı, sadece sunucu kontrolünün ne kadar zor olduğunu ölçmek için bir soru yazıyordum. Görüyorsunuz, MMO benzeri bir omurga uygulamak için düzinelerce saati harcamak istemiyorum ve günün sonunda, sadece bazı müşteri istek parametrelerini veya bunun gibi bir şeyi geçersiz kılarak kolayca kolayca aldatılabilir. Ya da basitçe eğlenceli bir oyun olması gereken şeyi abartmak - daha güzel özellikler sunmak ya da cilalamak yerine, güvenlik konusunda harcadığınız çaba.
Billy Ninja

1

Temelde mümkün değil. Hile yapmamak için yerine koyduğunuz herhangi bir şey üzerinde çalışmak çok kolay olurdu.

Sorun şu ki, dağıttığınız herhangi bir yazılım ile kolayca bellekte değiştirebileceksiniz.

Ayrıca hile yapmak istiyorlarsa, bırak onları. Sadece oyunu kendileri için mahvediyorlar. Bu durumda hile yapmak için gerçek bir pratik kullanım yoktur, sadece oyunu kendiniz için mahvedersiniz.


1

Hile yapmayı önlemek / azaltmak için alabileceğiniz bir önlem için bir fikrim vardı (diğer cevaplara ek olarak). Müşterinin tüm kaynak kodlarını bir seferde vermemesi için ayarlamış olabilirsiniz, bunun yerine müşterinin mağazadan yeni bir ürün satın almak istediği her durumda, müşterinin belirli bilgileri göndermesi gerekir. Sunucuya ekleyin ve satın aldıkları her şey için yalnızca tüm bilgileri olması gerekenle eşleşiyorsa alın. Olmazsa, sunucu IP'lerini veya başka bir şeyi kara listeye alır.

Bunu, Dampes8n'in farklı kaynak sürümleri kullanma hakkında söylediği şeylerle birlikte kullanabilirsiniz, eğer çok sayıda farklı sürüm üretmenin bir yolunu bulursanız, her kullanıcı her seferinde tamamen farklı bir kaynak sürümünü çalıştırabilir, Kara kaynak listelerini, kaynak sürüm için de doğru öğe bilgisini bir daha asla vermeyeceğini de kontrol edin.

Bunun etkili olmasının ana nedeni, bir bilgisayar korsanı ilk kez korsanlığı doğru yapmazsa, bu korsanları değiştirmek için onları zorlaştırır, çünkü korsan her seferinde kusursuz bir şekilde çalışmaz. IP'lerini değiştirin ve yeni kaynak sürüm için kesmeyi tekrar tekrar yazın.


Dikkatli olurdum. Yapmak istediğiniz en son şey, yanlışlıkla ödeme yapan bir müşteriyi kazara yasaklamadır.
John McDonald

@JohnMcDonald Doğru, bu. Belki de sadece bu kaynak versiyonunu öldürüyor. Bu şekilde, eğer yanlışlıkla tuzağı tetiklerlerse, tarayıcıyı yenilemeleri gerekirken, bilgisayar korsanlarının tüm bilgisayar saldırılarını yeniden kodlamalarını sağlar.
AJMansfield 24:12

0

Evet, tamamen yapılamaz. Her zaman sunucuyu kontrol et. Oyun üzerinde etkisi olan herhangi bir şey sunucudan izin almalıdır.

Diğer cevapları tekrarlayacağım süre bu.

Ancak, hileleri önlemenin sonuna doğru yalnızca sunucuyu kontrol etmekten daha fazlasını yapabiliriz. Bazı özel sunucu kontrolleri eklemek zorunda kalabiliriz. Bununla birlikte, müşteri tarafı kontrollerinin değersiz olmadığını, hileler söz konusu olmadığında bant genişliğini ve sunucu işlerini koruduğunu unutmayın.

Bu sözü edilen:

  • Zorlu istemcileri azaltın: HTTPS üzerinden servis yapın, Çapraz kökenli kaynak paylaşımını (CORS) kullanın, yalnızca aynı kaynağa izin verin, alt kaynak bütünlüğünü kullanın. Tüm talepleri yerine getirmek için bir servis çalışanı uygulamanızı öneririm, bu aynı zamanda oyunun basitçe HTTP'ye taşınmasıyla da işe yaramayacağı anlamına gelir (çünkü HTTPS olmadan servis çalışanı yoktur, sunucu çalışanı istemci kısmını yapıyordur) CORS ve sunucu CORS bekliyor) ve HTTPS üzerinden hizmet veriyorlarsa, sunucu diğer menzili reddedeceği için çalışmaz.
  • Azaltıcı komut dosyası: Doğrulamayı kullanın ve herhangi bir işlem yapmak için bir belirteç isteyin. Sunucunun istemciye yeni bir belirteç vermesi gereken her güncelleme döngüsü belirtilir ve belirteç ne yaparsa yapılarak tüketilir ... geçerli bir belirteç gerektirir, belirteç her zaman değişir ve dolayısıyla tahmin edilemez aynı belirteci iki kez gönderir veya yanlış bir belirteç gönderir, sunucunun bir şey olduğunu bilir. Ekstra koruma için: bir tuş ile belirtecin Mesaj kimlik doğrulama kodunu (MAC) oluşturun ve bunu çerezlere ekleyin. Tanımlama bilgisini değiştirmek oturumu sonlandıracak (ve anahtarı tahmin etmeleri gerekir) ve belirteci değiştirmek MAC denetiminin başarısız olmasına neden olacaktır.
  • Kod değişikliklerini azaltma: Alt kaynak bütünlüğünün yanı sıra (hangi modern tarayıcıların çalışma zamanında da denetleyeceğini), değişkenlerinizi sınırlı bir kapsamda tutun (izin veren, kendi kendine çalışan anonim işlevleri ve javascript modüllerini kullanarak). Ayrıca, DOM'ye güvenmeyin (DOM nesnelerinizi sarmalayıp sarmalayıcılara eklemeniz gerekirse DOM yalnızca IO içindir, depolama alanına değil). Bu şekilde, konsolda ne olursa olsun oyun mantığına erişememelisiniz (bazı tarayıcı güvenlik açıklarından yararlanmıyorsanız). Ayrıca geliştirici araçlarını tespit etmek için teknikler kullanmayı düşünebilirsiniz (bunlar tarayıcıya özeldir ve her durumda çalışmayabilir veya gelecekte çalışmayı durduramazlar ... bu nedenle bu bir silahlanma yarışıdır).
  • Bir şey mi oldu? Oturum bozuldu mu? Geçerli maçtan oyuncuyu tekmeleyin, tekrar giriş yapmayı isteyin. Kullanıcıya "nadir bir şey olduğunu biliyoruz" (rastgele bir sunucu arızası değildi) ve evet, bu bir azaltma yöntemi olduğunu söyleme avantajına sahip olan bir captcha düşünün . Oh, ve bunları günlüğe kaydetmek için buğulama. Hem yanlış ifadeleri önlemek hem de destek biletlerini yanıtlamak için neden olduğunu doğrulayabilmeniz gerekir.

Evet, bunların hepsi hafifletici. Bütünlüğü kontrol etmeyecek ve yerel kapsamlardaki değişkenlere ulaşmanıza ve bunlarla uğraşmanıza izin vermeyecek özel bir tarayıcıya sahip olabiliriz ... daha sonra oyun kodu değiştirilen verileri doğru simgeyle gönderir ve sunucu kontrolleri oraya gelir oyun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.