Как вы предотвращаете копирование или изменение вашей веб-игры на JavaScript / HTML5?

45

Я нахожусь в процессе планирования игры, построенной с использованием JavaScript и HTML5.

У меня возникают проблемы с пониманием того, как вы можете помешать кому-либо просто скопировать JavaScript с веб-сервера и либо создать свою собственную игру с ним (не моя самая большая проблема), либо заменить свои собственные функции JavaScript и лишить всякую надежду надежных клиентов в дикий, если игра должна была в конечном итоге поддерживать мультиплеер.

Можно ли что-нибудь сделать, чтобы никто не читал JavaScript?

Если нет, то должна ли вся обработка игр происходить на сервере где-нибудь, и единственной обязанностью клиента является сбор информации от пользователя и рисование графики?

Кристиан
источник
22
В последнем параграфе говорится о праве, это верно для бизнес-приложений и верно для игр, всегда относитесь к клиенту как к хостелу.
Nate
4
Если я могу ПРОЧИТАТЬ это, у моего браузера уже есть копия. Тогда я также могу сохранить его в другом месте. Все, что вы позволяете прочитать, также может быть скопировано.
BerggreenDK

Ответы:

44

Храните все свои игровые данные и логику на сервере. Часть игры, которая находится на стороне клиента, может быть скопирована с использованием соответствующих инструментов в любом случае (даже если это Flash или Java), так что просто примите это и не слишком заботьтесь об этом.

Чтобы сохранить ваш javascript менее копируемым, из-за плохой читабельности вы можете уменьшить его . В любом случае, это хорошая практика, так как игровой сайт загружается быстрее.

Аидас Бендорайтис
источник
4
В зависимости от практики кодирования весь контент на сервере также может быть скомпрометирован. Чтобы минимизировать код и запутать, удерживает только тех, кто не хочет тратить время и логически отображать, что он делает. Суть в том, если вы беспокоитесь о правах на интеллектуальную собственность вашего кода; не помещайте это в сеть.
Джон
1
Это не значит, что вы не должны минимизировать, что отпугивает ленивых людей. Вы также можете попробовать обработать игровую логику на сервере и вернуть объекты json через ajax, но результат можно просмотреть с помощью firebug. Запутывайте свою производственную версию, но сохраняйте версию с сильным комментарием для себя (это усложняет поддержку). Вы можете сделать что-то, чтобы удержать людей, но это никогда не на 100% безопасно.
Джон
3
На самом деле. Расширение минимизированного кода даже не требует больших усилий. jsbeautifier.org
Джеймс
@ Джон, пожалуйста, обратите внимание, что иногда сдерживание ленивых людей не имеет значения, так как некоторые игры рушатся, когда появляется один мошенник, поэтому не имеет значения, если один или несколько читеров обманывают.
о0 '.
11

как вы могли бы помешать кому-то просто скопировать JavaScript с веб-сервера и создать собственную игру с ним (не моя самая большая проблема)

Вот где закон помогает. На практике это не так часто случается.

или заменой их собственных функций JavaScript и лишением всякой надежды на надежных клиентов в дикой природе, если игра в конечном итоге будет поддерживать многопользовательскую игру.

В природе нет надежных клиентов именно по такой причине. Откажись от этой мечты сейчас. :)

Kylotan
источник
Закон не будет иметь особого смысла, если сайт, на котором он размещен, находится в стране, которая не особо заботится о правах на интеллектуальную собственность, или по какой-либо причине противоречит вашей стране. Даже если это не так, стоимость инициирования (возможно, международного) юридического действия, вероятно, намного превышает финансовые ресурсы того, кто задаст этот вопрос здесь.
Пол Легато
Цель ответа была не столько в том, чтобы рекомендовать судебный иск, но в том, чтобы попытаться заблокировать такое программное обеспечение в большинстве случаев бессмысленно, по крайней мере, отчасти потому, что многие люди, которые будут копировать его, не приветствуются законом, а также потому, что клиенты может быть реконструирован независимо от того, используют ли они Javascript или нет.
Kylotan
8

Так же, как все остальные рекомендовали; сохранить как можно больше кода на стороне сервера.

Метод, который я использовал для борьбы с копированием кода, немного странный, но до сих пор он работал хорошо.

  • На стороне сервера, сгенерируйте уникальный идентификатор и сохраните его для дальнейшего использования.
  • На стороне сервера добавьте уникальный идентификатор в элемент скрипта во время рендеринга HTML.
  • На стороне клиента создайте соединение WebSocket и передайте уникальный идентификатор на сервер.
  • Сторона сервера, сопоставьте идентификатор с текущим списком.
  • Если совпадение не найдено, закройте соединение.
  • Если матч будет найден, заменить обработчик сообщений с «правильным» один и сброшенным идентификатором.
  • Передайте ваш секретный код клиенту как JSON, {"func": "function () {dostuff ();}"}
  • Клиентская сторона, следите за сообщениями, если они содержат "func", оцените его.

Теперь ваш секретный код выполняется на стороне клиента и не будет отображаться в view-source или инспекторах / консолях. Есть еще способы добраться до кода, но это немного сложнее.

Стивен Белэнджер
источник
Если бы мне нужно было взять что-то из вышеупомянутого решения; Я бы тоже подключил настоящий WebSocket и попытался бы сделать «фальшивый клиент» или использовать инструмент отладки Firebug в браузере и просто остановить скрипт, чтобы получить значения.
BerggreenDK
Вы не можете создать поддельный клиент, если не можете каким-то образом предсказать, какие уникальные идентификаторы в настоящее время доступны, так как они генерируются во время загрузки страницы и отбрасываются во время соединения со скриптом. Также сложно остановить скрипт и посмотреть значения, так как вы используете анонимную функцию. Как я уже сказал, есть еще способы добраться до кода, это просто сложнее. По большей части этого достаточно, чтобы ваш код был «достаточно безопасным». Вы не можете сделать намного больше, чем это с клиентским кодом.
Стивен Белэнджер
Было бы довольно легко написать поддельный клиент, который просто загружает реального клиента с сервера и удаляет из него текущее секретное значение при каждом запуске.
Пол Легато
Я бы не сказал, что это «легко», а не «невозможно». Как я уже сказал, есть способы обойти это. Там нет такого понятия, как совершенно безопасная система. Просто адекватно затененные интерфейсы таковы, что большинству придется слишком много усилий взламывать. В этом случае вы будете передавать потоковые фрагменты кода, поэтому хакеру потребуется создать клиент для получения и упорядочения кода в полезную структуру. Вы будете транслировать код так, как вам нужно, чтобы у хакера не было немедленного доступа к полному дампу кода.
Стивен Белэнджер
3

Единственный способ быть уверенным в том, что ваш игровой код будет защищен, - это создать игру типа клиент / сервер и разместить на сервере как можно больше кода. И конечно, сделайте этот сервер безопасным!

Основная проблема заключается в том, что если код работает на моем компьютере, я могу проверить его, декомпилировать и выяснить, как он работает. Это верно для JavaScript, Flash, C ++ и всего остального. На самом деле, при разработке MMO (именно там находится мой профессиональный опыт), с самого начала предполагается, что клиент скомпрометирован: все, что вы написали для клиента, уже в руках того, кто захочет, злоумышленник или не.

Сокращение кода действительно обеспечивает небольшую защиту от людей, которые слишком ленивы, чтобы унифицировать его, используя один из множества инструментов. (Но рабочий код должен быть уменьшен, чтобы уменьшить объем данных).

Но если вы находитесь в ситуации, когда, скажем, ваш начальник хочет какой-то защиты кода, вы можете использовать Google «Javascript obfuscator» - есть много бесплатного и платного программного обеспечения, которое делает JS по крайней мере настолько непроницаемым чтобы декомпилировать как Flash.

DariusK
источник
Я просто хочу отметить, что C ++ не находится на том же уровне, что и Javascript. C ++ компилируется в сборку, которую нужно прочитать, чтобы понять логику игры. Каждый оператор в C ++ может создавать несколько строк в сборке, что делает его очень трудоемкой задачей. Запутывающий javascript - это не то же самое, так как это один и тот же язык. Любой может «украсить» его и начать читать почти понятные человеку заявления.
ТомЦагк
3

Помимо всего этого разговора о запутывании кода, обязательно поместите очень четкую декларацию об авторских правах в верхней части каждого файла и сделайте очевидным, что лицензия не допускает изменения или коммерческого использования. Это дает вам юридическую защиту, если кто-то попытается скопировать его. Если вы не желаете обращаться в суд по этому поводу, тогда весь этот вопрос носит в основном академический характер.

coderanger
источник
Это хорошо за то, что оно стоит, но это не так много. Концепция интеллектуальной собственности на практике не признается во многих странах, и в любом случае судебные издержки, связанные с судебным делом, вероятно, намного превышают те, которые имеются на этом сайте, особенно если злоумышленник находится в другой стране.
Пол Легато
0

Я думаю, что если вы сделаете свою игру многопользовательской, что влечет за собой сохранение игровой логики на сервере, вы, вероятно, сделаете ее по крайней мере менее привлекательной для кражи. Вы не можете доверять клиенту на самом деле. Как уже упоминалось, есть инструменты даже для скомпилированных языков, таких как Java и Flash, которые могут реконструировать текст кода из байтового кода.


источник
-1

Вам нужно использовать Javascript Minifier. Есть много доступных вариантов, не стесняйтесь найти тот, который вам нравится. Чтобы спасти вас от некоторых исследований, вы можете попробовать Yahoo Minifier . Я не управлял этим сам, но я предполагаю, что это сделает то, что вам нужно. Цель состоит в том, чтобы 1) уменьшить размер файла и 2) запутать код. Это достигается путем удаления всех пробелов, комментариев и замены имен переменных на более короткие, бессмысленные.

Большинство современных веб-приложений содержат значительное количество Javascript и используют такие инструменты, чтобы попытаться защитить свой IP. Как уже говорили другие, вы всегда должны спрашивать: «Могу ли я сделать это на сервере?» для важных или деликатных операций, но я считаю, что это должно обеспечить некоторую защиту.

Алекс Шеарер
источник
7
Безопасность неизвестностью скрывает потенциал безопасности. :)
Rushyo
1
Прошу вас. Я слышу эту цитату все время, но это абсолютно не соответствует действительности. По правде говоря, затенение JS, по крайней мере, отпугнет некоторых людей.
2
Минификатор не помогает ему. Я полагаю, что большинство «серьезных» людей знает, как «расширить» эти сценарии снова.
BerggreenDK
1
@ Sergio: вы слышите эту цитату все время, потому что, вы знаете, это правда . Это будет сдерживать «некоторых» людей, правда, но сдерживать «некоторых» людей бессмысленно: когда ты один раз сломан , ты падаешь.
о0 '.
-1

Используйте компилятор Google closure http://code.google.com/closure/compiler/ Это не просто js minimizer;)

Каковы преимущества использования Closure Compiler?

  1. Эффективность. Closure Compiler уменьшает размер ваших файлов JavaScript и делает их более эффективными, помогая быстрее загружать ваше приложение и уменьшая ваши потребности в пропускной способности.

  2. Проверка кода. Компилятор Closure предоставляет предупреждения о недопустимом JavaScript и предупреждения о потенциально опасных операциях, помогая вам создавать JavaScript, который менее глючит и проще в обслуживании.

Deyaa
источник
-1

Или вы можете использовать что-то вроде Game Maker HTML5 для создания своей игры, которая будет запутывать код для вас. Это означает, что это сделает код нечитаемым для людей. И это будет почти невозможно редактировать.

Gwhiz
источник
2
-1 Обфускация пойдет только так далеко. Это, конечно, не защитит игру от копирования или изменения - как уже упоминалось в ответах на этот вопрос.
Doppelgreener
-1

Все проприетарное должно храниться на стороне сервера. Клиентской стороне вы предоставляете достаточно только для того, чтобы облегчить им использование игры.

Эдвард Кост
источник
-1

Размещение всего на сервере может иметь проблемы с производительностью и не использовать весь потенциал Интернета, как мы его знаем сегодня.

Вы можете написать свой код на C ++ и скомпилировать его в двоичные файлы.

Собственный клиент (NaCl).

См. Https://stackoverflow.com/questions/9018537/how-to-run-c-programs-on-the-web-inside-a-browser

Иегуда Мазаль
источник
Добро пожаловать в GDSE. ОП спрашивает о JavaScript конкретно; так что, хотя они, возможно, могли бы переписать на C ++ и использовать NaCl, это решение на самом деле не отвечает заявленным потребностям. Кроме того, ответы должны быть настолько самодостаточными, насколько это возможно - упоминание NaCl и сброс ссылки не так хорошо, как краткое изложение того, что такое NaCl или почему оно может помочь.
Пикалек