Jak zapobiec kopiowaniu lub modyfikowaniu gry internetowej JavaScript / HTML5?

45

Jestem w trakcie planowania gry zbudowanej przy użyciu JavaScript i HTML5.

Mam problem ze zrozumieniem, w jaki sposób można uniemożliwić komuś po prostu skopiowanie kodu JavaScript z serwera WWW i albo stworzenie z nim własnej gry (nie moja największa obawa), albo zastąpienie własnych funkcji JavaScript i budzenie nadziei na niezawodnych klientów w dziki, jeśli gra ma w końcu wspierać tryb wieloosobowy.

Czy można coś zrobić, aby nikt nie czytał JavaScript?

Jeśli nie, to czy całe przetwarzanie gry powinno odbywać się gdzieś na serwerze, a jedynym obowiązkiem klienta jest przechwytywanie danych wejściowych użytkownika i rysowanie grafiki?

chrześcijanin
źródło
22
Twój ostatni akapit czyta o tym, co jest słuszne, to prawda dla aplikacji biznesowych i prawda dla gier, zawsze traktuj klienta jako hostę.
Nate
4
Jeśli mogę przeczytać, moja przeglądarka ma już kopię. Następnie mogę zapisać go gdzieś indziej. Wszystko, co pozwala się czytać, można również skopiować.
BerggreenDK

Odpowiedzi:

44

Zachowaj wszystkie dane i logikę gry na serwerze. Część gry po stronie klienta i tak można skopiować za pomocą odpowiednich narzędzi (nawet jeśli jest we Flashu lub Javie), więc po prostu ją zaakceptuj i nie przejmuj się tym zbytnio.

Aby twój skrypt javascript był mniej kopiowalny, z powodu złej czytelności, możesz go zminimalizować . To i tak dobra praktyka, ponieważ przyspiesza pobieranie witryny z grami.

Aidas Bendoraitis
źródło
4
W zależności od praktyk kodowania, cała zawartość na serwerze może być również zagrożona. Aby zminimalizować kod i zaciemnić, odstrasza tylko tych, którzy nie chcą tracić czasu i logicznie odwzorowuje, co robi. Podsumowując, jeśli martwisz się o prawa własności intelektualnej swojego kodu; nie umieszczaj go w sieci.
John
1
To nie znaczy, że nie powinieneś się umniejszać, to odstrasza leniwych ludzi. Możesz także spróbować przetworzyć logikę gry na serwerze i zwrócić obiekty json przez ajax, ale powrót można nadal wyświetlać za pomocą firebug. Ukryj swoją wersję produkcyjną, ale zachowaj mocno skomentowaną wersję dla siebie (utrudnia to utrzymanie). Możesz robić rzeczy, aby zniechęcać ludzi, ale nigdy nie jest w 100% bezpieczny.
John
3
W rzeczy samej. Rozszerzenie zminimalizowanego kodu nie wymaga nawet dużego wysiłku. jsbeautifier.org
James
@John, proszę zauważyć, że czasami odstraszanie leniwych ludzi jest nieistotne, ponieważ niektóre gry są zrujnowane, gdy pojawia się pojedynczy oszust, więc nie ma to znaczenia, jeśli tylko jeden lub wielu oszukuje.
o0 ”.
11

jak można uniemożliwić komuś po prostu kopiowanie kodu JavaScript z serwera i tworzenie z nim własnej gry (nie moja największa obawa)

Tutaj pomaga prawo. W praktyce nie zdarza się to często.

lub zastępując własne funkcje JavaScript i budząc nadzieję na niezawodnych klientów na wolności, jeśli gra ma w końcu wspierać tryb wieloosobowy.

Z tego właśnie powodu nie ma wiarygodnych klientów na wolności. Porzuć teraz ten sen. :)

Kylotan
źródło
Prawo nie będzie wiele przydatne, gdy witryna go hostująca znajduje się w kraju, który nie dba o prawa własności intelektualnej lub z innego powodu jest antagonistyczny w stosunku do twojego kraju. Nawet jeśli tak nie jest, koszt wszczęcia (potencjalnie międzynarodowego) postępowania sądowego prawdopodobnie znacznie wykracza poza zasoby finansowe osoby, która zadałaby to pytanie tutaj.
Paul Legato,
Odpowiedź nie polegała raczej na zaleceniu działań prawnych, ale na sugerowaniu, że próba zablokowania takiego oprogramowania jest w większości bezcelowa, przynajmniej częściowo dlatego, że wielu ludzi, którzy je skopiują, jest zniechęconych przez prawo, ale także dlatego, że klienci można poddać inżynierii wstecznej, niezależnie od tego, czy używają Javascript, czy nie.
Kylotan
8

Tak jak wszyscy inni zalecili; przechowuj jak najwięcej kodu po stronie serwera.

Metoda, z której korzystałem przy kopiowaniu kodu, jest nieco dziwna, ale jak dotąd działała dobrze.

  • Po stronie serwera wygeneruj unikalny identyfikator i zapisz go na później.
  • Po stronie serwera dodaj unikalny identyfikator w skrypcie podczas renderowania HTML.
  • Po stronie klienta utwórz połączenie WebSocket i przekaż unikalny identyfikator do serwera.
  • Po stronie serwera dopasuj identyfikator do bieżącej listy.
  • Jeśli nie znaleziono dopasowania, zamknij połączenie.
  • Jeśli mecz zostanie znaleziony, zastąpi obsługi wiadomość z „właściwej” jednego i wyrzucić id.
  • Przesyłaj strumieniowo swój tajny kod do klienta jako JSON, {"func": "function () {dostuff ();}"}
  • Po stronie klienta uważaj na wiadomości, jeśli zawierają „func”, sprawdzaj je.

Teraz twój tajny kod działa po stronie klienta i nie będzie wyświetlany w źródle widoku ani w kontrolerach / konsolach. Wciąż istnieją sposoby na uzyskanie kodu, ale jest to nieco trudniejsze.

Stephen Belanger
źródło
Gdybym musiał wziąć coś z powyższego rozwiązania; Chciałbym również podłączyć prawdziwy WebSocket i spróbować stworzyć „fałszywego klienta” lub użyć narzędzia do debugowania Firebug w przeglądarce i po prostu zatrzymać skrypt, aby pobrać wartości.
BerggreenDK
Nie można stworzyć fałszywego klienta, chyba że można w jakiś sposób przewidzieć, jakie unikalne identyfikatory są obecnie dostępne, ponieważ są one generowane w czasie ładowania strony i rzucane w czasie połączenia ze skryptem. Również zatrzymanie skryptu i spojrzenie na wartości jest trudne, ponieważ ewaluujesz anonimową funkcję. Tak jak powiedziałem, wciąż istnieją sposoby na uzyskanie kodu, jest to po prostu trudniejsze. W większości wystarcza, aby Twój kod był „wystarczająco bezpieczny”. Nie możesz zrobić nic więcej z kodem po stronie klienta.
Stephen Belanger
Łatwo byłoby napisać fałszywego klienta, który po prostu ładuje prawdziwego klienta z serwera i usuwa z niego bieżącą tajną wartość przy każdym uruchomieniu.
Paul Legato,
Nie powiedziałbym, że to „łatwe”, a nie „niemożliwe”. Jak powiedziałem, istnieją sposoby na obejście tego. Nie ma czegoś takiego jak idealnie bezpieczny system. Tylko odpowiednio zasłonięte interfejsy, aby większość z nich nie mogła włamać się do sieci. W takim przypadku będziesz przesyłać strumieniowo fragmenty kodu, więc haker musiałby utworzyć klienta, aby odbierać i ustawiać kod w przydatną strukturę. Przesyłasz kod tak, jak go potrzebujesz, aby haker nie miał natychmiastowego dostępu do pełnego zrzutu kodu.
Stephen Belanger
3

Jedynym sposobem na uzyskanie pewności, że kod gry będzie bezpieczny, jest zbudowanie gry typu klient / serwer i umieszczenie na serwerze jak największej liczby kodów. I oczywiście, zabezpiecz ten serwer!

Głównym problemem jest to, że jeśli kod działa na moim komputerze, mogę go sprawdzić, zdekompilować i dowiedzieć się, jak to działa. Dotyczy to JavaScript, Flash, C ++, wszystkiego innego. W rzeczywistości w rozwoju MMO (czyli tam, gdzie jest większość mojego doświadczenia zawodowego) od samego początku założeniem jest, że klient jest narażony na szwank: wszystko, co napisałeś dla klienta, jest już w rękach każdego, kto tego chce, złośliwego lub nie.

Kod minimalizujący zapewnia niewielką ochronę przed ludźmi, którzy są zbyt leniwi, aby rozpakować go za pomocą jednego z wielu dostępnych narzędzi. ( Należy jednak zminimalizować kod produkcyjny, aby zmniejszyć ślad danych).

Ale jeśli znajdujesz się w sytuacji, gdy, powiedzmy, twój szef chce jakiejś ochrony kodu, możesz google „JavaScript obfuscator” - istnieje wiele darmowych i płatnych programów, które sprawiają, że JS jest co najmniej tak samo nieprzepuszczalny do dekompilacji tak jak Flash.

DariusK
źródło
Chciałbym tylko zaznaczyć, że C ++ nie jest na tym samym poziomie co Javascript. C ++ kompiluje się w asemblerze, który ktoś musi przeczytać, aby zrozumieć logikę gry. Każda instrukcja w C ++ może tworzyć wiele wierszy w asemblerze, co sprawia, że ​​jest to bardzo czasochłonne zadanie. Zaciemnianie javascript nie jest tym samym, ponieważ jest w tym samym języku. Każdy może go „upiększyć” i zacząć czytać niemal czytelne dla człowieka stwierdzenia.
TomTsagk
3

Oprócz całej tej dyskusji o zaciemnianiu kodu, umieść bardzo wyraźną deklarację praw autorskich na górze każdego pliku i wyraź, że licencja nie zezwala na modyfikację lub komercyjne wykorzystanie. Daje to regres prawny, jeśli ktoś spróbuje go skopiować. Jeśli nie chcesz iść do sądu, to całe pytanie jest w większości akademickie.

koderanger
źródło
To jest w porządku za to, co jest warte, ale to niewiele. Pojęcie własności intelektualnej w praktyce nie jest uznawane w wielu krajach, aw każdym razie koszty prawne postępowania sądowego prawdopodobnie wykraczają daleko poza to, co ma plakat na tej stronie, szczególnie jeśli osoba atakująca znajduje się w innym kraju.
Paul Legato,
0

Myślę, że jeśli uczynisz swoją grę wieloosobową, co pociąga za sobą utrzymanie logiki gry na serwerze, prawdopodobnie uczyniłbyś to przynajmniej mniej atrakcyjnym do kradzieży. Naprawdę nie możesz ufać klientowi. Jak ktoś już wspomniał, istnieją narzędzia do nawet skompilowanych języków, takich jak Java i Flash, które mogą odtwarzać tekst kodu z kodu bajtowego.


źródło
-1

Musisz użyć Javascript Minifier. Dostępnych jest wiele opcji, które możesz znaleźć. Aby zaoszczędzić trochę badań, możesz wypróbować Yahoo Minifier . Nie prowadziłem tego sam, ale zakładam, że zrobi to, czego potrzebujesz. Celem jest 1) zmniejszenie rozmiaru pliku i 2) zaciemnienie kodu. Odbywa się to poprzez usunięcie wszystkich białych znaków, komentarzy i zastąpienie nazw zmiennych krótszymi, bezsensownymi.

Większość aplikacji internetowych ma obecnie znaczną liczbę skryptów Javascript i korzysta z takich narzędzi, aby chronić swoje IP. Jak powiedzieli inni, zawsze powinieneś zapytać: „Czy mogę to zrobić na serwerze?” w przypadku ważnych lub wrażliwych operacji, ale uważam, że powinno to zapewnić pewną ochronę.

Alex Schearer
źródło
7
Bezpieczeństwo przez zaciemnienie przesłania potencjał bezpieczeństwa. :)
Rushyo,
1
Oh proszę. Cały czas słyszę ten cytat, ale to absolutnie nieprawda. Mówiąc prawdę, zasłanianie JS przynajmniej powstrzymałoby niektórych ludzi.
2
minifier mu nie pomaga. Wierzę, że większość „poważnych” ludzi wie, jak „rozszerzyć” te skrypty.
BerggreenDK,
1
@Sergio: cały czas słyszysz ten cytat, ponieważ, wiesz, to prawda . To odstraszy „niektórych” ludzi, to prawda, ale odstraszanie „niektórych” ludzi nie ma sensu: kiedy raz zostaniesz złamany , zejdziesz na dół.
o0 ”.
-1

Użyj kompilatora zamknięcia Google http://code.google.com/closure/compiler/ To nie jest tylko minimalizator js;)

Jakie są zalety korzystania z kompilatora zamknięcia?

  1. Wydajność. Kompilator zamknięcia zmniejsza rozmiar plików JavaScript i zwiększa ich wydajność, pomagając szybciej ładować aplikację i zmniejszając zapotrzebowanie na przepustowość.

  2. Sprawdzanie kodu Kompilator zamknięcia zapewnia ostrzeżenia o nielegalnym JavaScript i ostrzeżenia o potencjalnie niebezpiecznych operacjach, pomagając w tworzeniu JavaScript, który jest mniej wadliwy i łatwiejszy w utrzymaniu.

Deyaa
źródło
-1

Lub możesz użyć czegoś takiego jak Game Maker HTML5, aby stworzyć grę, która zaciemni kod dla Ciebie. Oznacza to, że sprawi, że kod będzie nieczytelny dla ludzi. I będzie prawie niemożliwe do edycji.

Gwhiz
źródło
2
-1 Zaciemnienie pójdzie tylko do tej pory. Z pewnością nie ochroni gry przed kopiowaniem lub modyfikacją - jak wspomniano w innych odpowiedziach zaciemniających na to pytanie.
doppelgreener
-1

Wszelkie własności powinny być przechowywane po stronie serwera. Po stronie klienta podajesz tylko tyle, aby ułatwić im korzystanie z gry.

Edward Coast
źródło
-1

Umieszczenie wszystkiego na serwerze może mieć problem z wydajnością i nie wykorzystać całego potencjału sieci, jaki znamy dzisiaj.

Możesz napisać kod w c ++ i skompilować go do plików binarnych.

Klient natywny (NaCl).

Zobacz https://stackoverflow.com/questions/9018537/how-to-run-c-programs-on-the-web-inside-a-browser

yehuda mazal
źródło
Witamy w GDSE. OP pyta konkretnie o JavaScript; więc chociaż mogliby ponownie napisać do C ++ i użyć NaCl, to rozwiązanie tak naprawdę nie zaspokaja potrzeb, jak stwierdzono. Ponadto odpowiedzi powinny być tak samodzielne, jak to możliwe - wzmianka o NaCl i odrzucenie linku nie jest tak dobre, jak przedstawienie podsumowania tego, czym jest NaCl lub dlaczego może to pomóc.
Pikalek