JavaScript / HTML5 Webゲームがコピーまたは変更されるのをどのように防止しますか?


45

私はJavaScriptとHTML5を使用して構築されたゲームを計画しています。

誰かがWebサーバーからJavaScriptを単純にコピーし、それを使って独自のゲームを作成する(私の最大の関心事ではない)ことを防ぐ方法を理解するのに苦労しています。ゲームが最終的にマルチプレイヤーをサポートする場合はワイルドです。

誰もがJavaScriptを読み取れないようにするために何かできますか?

そうでない場合、すべてのゲーム処理は、ユーザー入力のキャプチャとグラフィックスの描画のみをクライアントが担当するサーバーで実行する必要がありますか?


22
最後の段落では、ビジネスアプリに当てはまること、ゲームに当てはまることについて、クライアントを常にホストとして扱います。
ネイト

4
読むことができれば、ブラウザにはすでにコピーがあります。その後、別の場所に保存することもできます。読み取りを許可したものはすべてコピーすることもできます。
BerggreenDK

回答:


44

すべてのゲームデータとロジックをサーバーに保持します。クライアント側にあるゲームの一部は、とにかく適切なツールを使用してコピーできます(FlashまたはJavaであっても)ので、受け入れて、あまり気にしないでください。

可読性が悪いため、JavaScriptのコピー可能性を低く保つために、縮小できます。とにかく、それはゲームサイトのダウンロードを高速にするので、良い習慣です。


4
コーディングの方法によっては、サーバー上のすべてのコンテンツも危険にさらされる可能性があります。コードを縮小して難読化することは、時間をかけたくない人だけを阻止し、それが何をしているかを論理的にマッピングすることです。要するに、コードの知的財産権を心配しているのであれば、ウェブ上に置かないでください。
ジョン

1
それはあなたが縮小するべきではないという意味ではありません、それは怠け者を阻止します。サーバーでゲームロジックを処理して、Ajaxを介してjsonオブジェクトを返すこともできますが、その戻り値はfirebugで表示できます。製造バージョンを難読化しますが、自分用にかなりのコメントバージョンを保持します(これにより、保守が難しくなります)。あなたは人々を阻止するために何かをすることができますが、それは決して100%安全ではありません。
ジョン

3
確かに。縮小されたコードを拡張することは、それほど労力もかかりません。jsbeautifier.org
ジェームズ

@Johnは、たまに怠zyな人を思いとどまらせるのは無意味であることに注意してください。1人の詐欺師が現れると一部のゲームが台無しになります。
o0 '。

11

誰かがWebサーバーからJavaScriptを単純にコピーし、それを使って独自のゲームを作成することを防ぐ方法(私の最大の関心事ではありません)

これは法律が役立つところです。実際には、これは非常に頻繁に起こるようではありません。

または、ゲームが最終的にマルチプレイヤーをサポートすることになった場合、独自のJavaScript関数を代用し、信頼できるクライアントに野望を吹き飛ばします。

まさにこのような理由から、信頼できるクライアントは存在しません。今この夢をあきらめます。:)


法律は、それをホストするサイトが知的財産権をあまり気にしない国にある場合、または何らかの理由であなたの国に敵対する国にある場合、あまり役に立ちません。そうでない場合でも、(潜在的に国際的な)法的措置を開始する費用は、ここでこの質問をする人の財源をはるかに超える可能性があります。
ポールレガート

答えの意図は法的措置を推奨することではありませんでしたが、そのようなソフトウェアをロックしようとすることはほとんど無意味であると示唆することでした。 Javascriptを使用するかどうかにかかわらず、リバースエンジニアリングできます。
キロタン

8

みんながお勧めしたように。サーバー側で可能な限り多くのコードを保持します。

コードコピーの処理に使用した方法は少し奇妙ですが、これまでのところうまく機能しています。

  • サーバー側で、一意のIDを生成し、後で使用するために保存します。
  • サーバー側で、htmlレンダリング中にスクリプト要素に一意のIDを追加します。
  • クライアント側で、WebSocket接続を作成し、一意のIDをサーバーに渡します。
  • サーバー側で、現在のリストに対してIDを一致させます。
  • 一致が見つからない場合は、接続を閉じます。
  • 一致するもの見つかった場合、メッセージハンドラを「適切な」ものに置き換え、IDを破棄します。
  • 秘密コードをJSONとしてクライアントにストリーミングします。{"func": "function(){dostuff();}"}
  • クライアント側で、メッセージに「func」が含まれている場合は監視し、評価します。

これで、秘密コードがクライアント側で実行され、view-sourceまたはインスペクター/コンソールに表示されなくなります。コードを取得する方法はまだありますが、かなり難しいです。


上記のソリューションから何かを取得する必要がある場合; 真のWebSocketも接続して「偽のクライアント」を作成するか、ブラウザでFirebugデバッグツールを使用して、スクリプトを停止して値をチェックアウトします。
BerggreenDK

ページの読み込み時に生成され、スクリプトの接続時に投げられるため、現在使用可能な一意のIDを何らかの方法で予測できない限り、偽のクライアントを作成することはできません。また、匿名関数を評価しているため、スクリプトを停止して値を確認することは困難です。私が言ったように、コードを取得する方法はまだありますが、それはもっと難しいです。ほとんどの場合、コードが「十分に安全」であるために十分です。クライアント側のコードではそれ以上のことはできません。
スティーブンベランジャー

サーバーから実際のクライアントを読み込むだけで、起動するたびに現在のシークレット値をスクレイプする偽のクライアントを作成するのは非常に簡単です。
ポールレガート

私はそれが「不可能ではない」ほど「簡単」だとは言いません。私が言ったように、それを回避する方法があります。完全に安全なシステムのようなものはありません。ほとんどの人がハッキングするのにあまりにも多くの努力を感じるように、ちょうど十分に隠されたインターフェース。この場合、コードのビットをストリーミングするので、ハッカーはクライアントを作成してコードを受信し、便利な構造に配置する必要があります。必要に応じてコードをストリーミングするので、ハッカーは完全なコードダンプにすぐにアクセスできません。
スティーブンベランジェ

3

ゲームコードが安全であることを合理的に確信する唯一の方法は、クライアント/サーバータイプのゲームを構築し、サーバーにできるだけ多くのコードを配置することです。そしてもちろん、そのサーバーを安全にしましょう!

主な問題は、コンピューターでコードが実行されている場合、コードの検査、逆コンパイル、およびその動作の把握ができることです。これは、JavaScript、Flash、C ++、その他すべてに当てはまります。実際、MMO開発(私の専門的な経験の大部分である)では、最初からクライアントが危険にさらされているという仮定があります。ありません。

コードの縮小は、世の中にある多くのツールの1つを使用して、コードを縮小するのが面倒な人に対するわずかな保護を提供します。(ただし、データのフットプリントを削減するために生産コード縮小する必要があります。)

しかし、たとえば上司が何らかのコード保護を望んでいる状況にいる場合は、「Javascript obfuscator」をグーグルで検索できます。JSを少なくとも不浸透にする無料の有料ソフトウェアがたくさんあります。 Flashのように逆コンパイルします。


C ++はJavascriptと同じレベルではないことを指摘したいだけです。C ++はアセンブリにコンパイルされ、ゲームのロジックを理解するために誰かが読む必要があります。C ++の各ステートメントは、アセンブリで複数の行を作成できるため、非常に時間のかかるタスクになります。javascriptの難読化は、同じ言語なので同じではありません。誰でもそれを「美化」して、ほとんど人間が読める文を読み始めることができます。
TomTsagk

3

このようなコードの難読化の話とは別に、各ファイルの先頭に非常に明確な著作権宣言を配置し、ライセンスが変更や商用利用を許可していないことを明確にしてください。誰かがそれをコピーしようとした場合、これは法的手段を提供します。あなたがそれについて法廷に行く気がないなら、この質問全体はほとんど学術的です。


これは価値があるものとしては問題ありませんが、それほどではありません。知的財産の概念は実際には多くの国で認識されておらず、いずれにせよ、特に攻撃者が他の国にいる場合、裁判の訴訟費用はこのサイトのポスターが入手できる金額をはるかに超える可能性があります。
ポールレガート

0

ゲームロジックをサーバーに保持することを必要とするゲームをマルチプレイヤーにすると、おそらく盗むことの魅力が少なくなると思います。クライアントを本当に信頼することはできません。誰かがすでに述べたように、JavaやFlashのようなコンパイル済み言語用のツールもあり、バイトコードからコードのテキストをリバースエンジニアリングできます。


-1

Javascript Minifierを使用する必要があります。多数のオプションがあり、お好きなものをお気軽に見つけてください。いくつかの研究を保存するには、Yahoo Minifierを試してみてください。私はそれを自分で実行していませんが、あなたが必要なことをするだろうと思います。目標は、1)ファイルサイズを削減し、2)コードを難読化することです。これは、すべての空白、コメントを削除し、変数名をより短くて意味のないものに置き換えることで実現されます。

現在、ほとんどのWebアプリケーションにはかなりの量のJavascriptがあり、これらのようなツールを使用してIPを保護しようとしています。他の人が言ったように、常に「サーバーでこれを行うことはできますか?」と尋ねるべきです。重要または機密性の高い操作には適していますが、これは何らかの保護を提供するはずです。


7
あいまいさによるセキュリティは、セキュリティの可能性を覆い隠します。:)
Rushyo

1
どうぞ 私はいつもこの引用を聞きますが、それは絶対に真実ではありません。真実は、JSを曖昧にすることで少なくとも一部の人々を抑止すると言われます。

2
ミニファイアーは彼を助けません。ほとんどの「深刻な」人々は、これらのスクリプトを再び「拡張」する方法を知っていると思います。
BerggreenDK

1
@セルジオ:あなたは知っている、それが本当であるので、あなたは常にこの引用を聞きます。それは抑止されます「一部」の人は、真のが、「いくつかの」人々を抑止することは無意味である:あなたが割れているときに一度、あなたがダウンして行きます。
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

-1

プロプライエタリなものはすべてサーバー側に保持する必要があります。クライアント側は、ゲームの使用を促進するのに十分なだけを提供します。


-1

すべてをサーバーに配置すると、パフォーマンスの問題が発生する可能性があり、今日のWebのすべての可能性を実際に使用していない可能性があります。

コードを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が何であるか、またはなぜそれが役立つかについての要約を提供するほど良くありません。
ピカレック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.