JavaScriptベースのゲーム Candy Box に慣れている方は多いと思います。
おそらくご存じのとおり、コンソールにコマンドを送信することで、このゲームのキャンディシステムをだますことができます。
たとえば、リンクをクリックすると、キャンディーの数がゆっくりと増加します。 Google Chromeを使用している人(Chromeはキーボードショートカットを知っているためですが、FirefoxまたはIEで可能であるためです)を使用しています) _Ctrl + Shift + I
_を押して、Console
に移動し、candies.setNbrOwned(2147483647)
をコンソールに送信して、すばやく簡単に砂糖を増やします。
これは他の状況で問題を引き起こす可能性がありますか?たとえば、ウィジェットを販売するWebサイトがあるとします。 JavaScriptを使用して(ブラウザのJavaScriptコンソールを使用しなくても)_userBalance = 2147483647
_やwidget.setPrice(0.01)
などを送信することで、誰かの残高(またはウィジェットの価格さえ)を変更できますか?
それが不可能な場合、なぜそうなのですか?なぜそれが不可能なのかについての私の最初の推測は、変更された変数がローカル変数として格納され、主要なものには何も影響を及ぼさないためです。
それが実際に可能である場合、どのような手段でそれを行うことができ、どのようにそれを防ぐことができますか?
はい、それは問題になる可能性がありますが、アプリケーションがそれを防ぐ方法があります。
インターネットアプリケーションのセキュリティを理解するには、クライアントとサーバーの違いを理解する必要があります。クライアント(ブラウザ)によって生成されたデータは、サーバーによって処理される前に、サニタイズおよび検証される必要があります。
ウィジェットを販売するWebサイトがある場合、ユーザーアカウントの残高をマシンのブラウザーに保存することはありません。これは、バランスシートを持ち帰り、引き出しの準備ができたときに持ち帰るように要求する、実店舗の銀行のようなものです。したがって、アプリケーションのサーバー側はバランスを追跡する必要があり、クライアントアプリケーションが自分に代わって実行されるアクションを要求することのみを許可します。
ゲームがクライアント側で実装されている場合はできません。クライアント側で実行されるロジックは変更できます。しかし、それをより困難にするいくつかの方法があります。 JavaScriptを最小化して難読化すると、コードの理解にかかる時間が長くなりますが、実際には何も保護されません。
理想的には、クライアント側ロジックはビューのみを表し、サーバーにアクション要求を送信します。クライアントのビューは常に変更される可能性がありますが、実際のロジックはすべてサーバー上で行われるため、ゲームの整合性は損なわれません。
JavaScript、およびその他すべてクライアント側のテクノロジーは、本質的に安全ではありません。不正行為を防止することはできません。