您如何防止您的JavaScript / HTML5网络游戏被复制或更改?


45

我正在计划使用JavaScript和HTML5构建的游戏。

我无法理解您如何才能防止某人从Web服务器上简单地复制JavaScript并使用它来制作自己的游戏(这不是我最大的担心),或者替代他们自己的JavaScript功能并在市场中破灭对可靠客户端的希望如果游戏最终要支持多人游戏,那就太疯狂了。

可以采取任何措施阻止任何人阅读JavaScript吗?

如果不是,是否所有游戏处理都应在某处的服务器上进行,而客户的唯一职责是捕获用户输入并绘制图形?


22
您在最后一段中读到了关于权利的信息,它对于商业应用程序来说是正确的,对于游戏来说正确的,始终将客户视为恶意对象。
Nate 2010年

4
如果我可以阅读它,则我的浏览器已经有一个副本。然后,我也可以将其保存在其他地方。您允许阅读的任何内容都可以复制。
BerggreenDK

Answers:


44

将所有游戏数据和逻辑保存在服务器上。无论如何,都可以使用适当的工具(即使是在Flash或Java中)复制客户端的部分游戏,因此只需接受即可,不必太在意。

由于可读性差,要使您的JavaScript不可复制,可以将其缩小。无论如何,这是一个好习惯,因为它可以加快游戏网站的下载速度。


4
根据编码惯例,服务器上的所有内容也可能会遭到破坏。最小化代码并进行混淆处理只会阻止那些不想花时间并从逻辑上确定其工作方式的人。底线是,如果您担心代码的知识产权;不要将其放在网络上。
约翰·

1
这并不意味着您不应该缩小规模,这会阻止那些懒惰的人。您也可以尝试在服务器上处理游戏逻辑,并通过ajax返回json对象,但是仍然可以使用firebug查看返回值。混淆您的生产版本,但为自己保留大量注释版本(这使维护变得更加困难)。您可以做些事情来阻止人们,但这绝不是100%安全的。
约翰·

3
确实。扩展缩小的代码甚至不需要花费很多精力。jsbeautifier.org
James

@John请注意,有时候阻止懒惰的人是无关紧要的,因为一旦单个作弊者出现,某些游戏就会被破坏,因此,如果只有一个或多个作弊者就没有关系了。
o0'。

11

如何防止某人简单地从Web服务器复制JavaScript并用它制作自己的游戏(这不是我最大的担心)

这是法律帮助的地方。实际上,这种情况似乎很少发生。

或替换他们自己的JavaScript函数,如果游戏最终要支持多人游戏,那么对于可靠客户的希望就破灭了。

正是由于这种原因,没有可靠的客户。现在就放弃这个梦想。:)


当托管站点在一个不太关心知识产权的国家或出于任何原因与您的国家对立的国家时,法律将不会有太大用处。即使不是这种情况,发起(可能是国际性的)法律诉讼的成本也可能远远超出在此提出此问题的人的财务资源。
Paul Legato 2012年

答案的目的并不是建议采取法律行动,而是建议试图锁定这种软件在大多数情况下是没有意义的,至少部分原因是因为许多愿意复制该软件的人受到法律的劝阻,而且还因为客户无论他们是否使用Javascript,都可以进行反向工程。
Kylotan

8

正如其他所有人所推荐的一样;在服务器端保留尽可能多的代码。

我用来处理代码复制的方法有点奇怪,但到目前为止效果很好。

  • 在服务器端,生成唯一的ID并将其存储以备后用。
  • 在服务器端,在HTML呈现期间在脚本元素中添加唯一ID。
  • 在客户端,创建WebSocket连接并将唯一ID传递给服务器。
  • 服务器端,将ID与当前列表匹配。
  • 如果找不到匹配项,则关闭连接。
  • 如果比赛发现,你的“正确”之一,并丢弃ID替换消息处理程序。
  • 将您的秘密代码以JSON,{“ func”:“ function(){dostuff();}”}的形式流式传输到客户端
  • 在客户端,请监视消息,如果它们包含“ func”,请对其进行评估。

现在,您的秘密代码正在客户端执行,并且不会显示在视图源或检查器/控制台中。仍然有获取代码的方法,但是要困难得多。


如果我需要从上述解决方案中获取一些东西;我也将连接真正的WebSocket并尝试制作一个“假客户端”,或者在浏览器中使用Firebug调试工具,然后停止脚本以检查值。
BerggreenDK

除非您能以某种方式预测当前可用的唯一ID,否则您就不能成为假客户端,因为它们是在页面加载时生成的,并在脚本连接时被扔掉的。同样,停止脚本并查看值很困难,因为您正在评估一个匿名函数。就像我说的那样,仍然有一些获取代码的方法,这只是困难得多。在大多数情况下,它足以使您的代码“足够安全”。使用客户端代码,您只能做更多的事情。
Stephen Belanger 2010年

编写一个伪造的客户端很容易,它只从服务器加载真实的客户端,并在每次启动时从客户端中刮取当前的秘密值。
Paul Legato 2012年

我不会说这很“简单”,而不是“并非不可能”。正如我所说,有很多解决方法。没有完美的安全系统。只是充分掩盖了接口,以至于大多数人都会发现需要付出太多的努力才能破解。在这种情况下,您将需要流式处理一些代码,因此黑客将需要创建一个客户端来接收代码并将其整理为有用的结构。您可以根据需要流式传输代码,因此黑客将无法立即访问完整的代码转储。
Stephen Belanger 2012年

3

合理确定您的游戏代码将是安全的唯一方法是构建客户端/服务器类型的游戏,并在服务器上放置尽可能多的代码。当然,还要确保该服务器的安全!

主要问题是,如果代码在我的计算机上运行,​​则可以对其进行检查,反编译并确定其工作方式。对于JavaScript,Flash,C ++或其他任何语言都是如此。实际上,在MMO开发(这是我的专业经验所基于的地方)中,从一开始就就假设客户受到了损害:您为客户编写的任何内容都已经在想要它的人的手中,无论是恶意的还是恶意的不。

精简代码的确为那些懒惰的人提供了很少的保护,而这些人懒得使用现有的众多工具之一将其最小化。(但是应该减少生产代码以减少其数据占用量。)

但是,如果您遇到的情况是,例如,您的老板想要某种代码保护,则可以使用Google“ JavaScript混淆器”进行搜索-有很多免费的收费软件,使得JS至少不渗透像Flash一样进行反编译。


我只想指出C ++与Java不在同一个级别。C ++编译为汇编,需要有人阅读才能理解游戏的逻辑。C ++中的每个语句都可以在汇编中创建多行,这使其成为一项非常耗时的任务。混淆javascript是不一样的,因为它是相同的语言。任何人都可以“美化”它并开始阅读几乎人类可读的语句。
TomTsagk

3

除了所有关于代码混淆的讨论之外,请确保在每个文件的顶部放置一个非常清晰的版权声明,并明确表明该许可证不允许更改或商业使用。如果有人尝试复制,这将为您提供法律追索权。如果您不愿意为此提起诉讼,那么整个问题大部分都是学术性的。


就其价值而言,这很好,但这并不很多。在实践中,知识产权概念在许多国家中并未得到认可,无论如何,法庭案件的法律费用可能远远超出了本网站发布者的承受能力,尤其是在攻击者在另一个国家的情况下。
Paul Legato 2012年

0

我认为,如果您使游戏成为多人游戏,这需要将游戏逻辑保留在服务器中,那么您可能至少会降低其吸引力。您不能真正信任客户。就像已经提到的那样,甚至有一些用于编译语言(例如Java和Flash)的工具,它们可以对字节码中的代码文本进行反向工程。


-1

您需要使用Javascript Minifier。有许多可用的选项可随时找到您喜欢的选项。为了节省您一些研究,您可以尝试Yahoo Minifier。我自己还没有运行,但是我想它会满足您的需求。目标是1)减少文件大小和2)混淆代码。这是通过删除所有空格,注释并将变量名替换为较短,无意义的变量来实现的。

当今,大多数Web应用程序都具有大量的Javascript,并使用诸如此类的工具来尝试保护其IP。正如其他人所说,您应该经常问:“我可以在服务器上这样做吗?” 对于重要或敏感的操作,但我认为这应该提供一些保护。


7
默默无闻的安全性掩盖了安全性的潜力。:)
Rushyo

1
哦拜托。我一直都听到这句话,但这绝对不是事实。说实话,让JS晦涩难道至少会阻止某些人。

2
矿工没有帮助他。我相信大多数“认真”的人都知道如何再次“扩展”那些脚本。
BerggreenDK

1
@Sergio:您一直都听到此报价,因为您知道这是真的。确实,这会阻止“一些”人,但是阻止“一些”人是没有意义的:一旦您被破解了,您就会失望。
o0'。

-1

使用Google闭包编译器http://code.google.com/closure/compiler/ 不仅仅是js最小化器;)

使用Closure Compiler有什么好处?

  1. 效率。Closure Compiler减小了JavaScript文件的大小并使它们更有效,从而帮助您的应用程序更快地加载并减少了带宽需求。

  2. 代码检查。Closure Compiler提供了针对非法JavaScript的警告和针对潜在危险操作的警告,从而帮助您生成错误更少,更易于维护的JavaScript。


-1

或者,您可以使用Game Maker HTML5之类的东西来创建您的游戏,而这会混淆您的代码。这意味着它将使人类无法阅读该代码。而且几乎不可能进行编辑。


2
-1迷惑只会走那么远。它肯定不会保护游戏免于被复制或更改-正如对此问题的其他混淆性答案所提到的。
doppelgreener 2012年

-1

任何专有内容都应保留在服务器端。您只提供足够的客户端,以方便他们使用游戏。


-1

将所有内容放在服务器上可能会出现性能问题,而不能像我们今天所知道的那样真正利用网络的所有潜力。

您可以用c ++编写代码并将其编译为二进制文件。

本机客户端(NaCl)。

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


欢迎使用GDSE。OP专门询问JavaScript。因此,尽管他们可能重写为C ++并使用NaCl,但该解决方案并不能真正满足上述需求。另外,答案应尽可能合理地包含在内-提及NaCl和转储链接并不如提供有关NaCl是什么或它可能有帮助的摘要这样的摘要。
皮卡列克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.