0

私は、オンライン チェス バリアント ゲームを開発しています。プレーヤーに代わって、移動に費やされた正確な時間をサーバーに通信する目的を持つ JavaScript 関数を作成したいと考えています。

もちろん、このメッセージは暗号化されますが、この機能を信頼するために、難読化アルゴリズムを信頼できるところまで難読化したいと考えています。

私が知っている難読化アルゴリズムはいくつかしかありませんが、最も興味深いのは象形文字です。しかし、壊れないわけではありません。実行速度とサイズは重要ではありません。同じ関数でメッセージを送信する関数によって費やされた時間を差し引くことができ、サイズは最大 2MB になることもあります。

ブラウザで実行する必要がある限り、十分な忍耐力があれば誰でもそれを少しずつ取り、それが何をするかを見ることができるので、壊れないアルゴリズムはないと確信しています。

悪意のあるユーザーからのより多くの労力と時間を必要とする代替手段はありますか?

編集WindowsXP のすべてのブラウザーでいくつかのテストを行ったところ、FF、IE、Opera、および Chrome では、遅延中のシステム時間の変更に関係なくsetTimeout、2 番目のパラメーターとして渡された遅延の後に関数がトリガーされるようです。他に示唆する情報が他にない場合、論理的な結論は、setTimeout 遅延によって指定される精度まで、Date() オブジェクトではなく setTimeout 関数を使用して、システム時間の変更に関係なく、クライアント側で時間を測定できるということです。時間。

ハミッシュは、以下の回答で、ブラウザーの日付/時刻 API の変更は簡単であると述べています。その場合、javascript コードは、setTimeout の実際の遅延時間を増加させる変更に対して脆弱です。サーバーが不合理な遅延時間を持つ誰かをだましている疑いを開始するように、いくつかのコードを設定する必要があります。ラグタイムが思考時間に含まれていない場合、これは常に問題になります。

サーバー側のタイミングを使用できないのには理由があります。ラグ タイムが妥当な量を超える場合があり、ユーザーは不満を抱くでしょう。また、ラグがすべての違いを生むこともあります。

元の質問に戻ります。最適な難読化方法を探しています。最適な方法は、攻撃者が難読化を解除するために必要な労力で測定されます。理想的には、攻撃者が難読化を解除できるよりも速く難読化アルゴリズムを変更し、そのアルゴリズムを二度と使用しないか、攻撃者が予期しない時間にめったに使用しないようにしたいと考えています。

4

2 に答える 2

4

コンピューターの時計を3時間前に設定すると、スクリプトが喜んで送信します-10800 seconds。信頼できる方法で情報を処理するためにJavaScriptに依存しないでください。サーバー側のコードを使用して、プレーヤーのターンが開始されたときと移動したときの差を計り、サーバー上にゲームの表現を完全に保持し、移動が有効であることを確認します。

于 2012-08-23T21:22:04.510 に答える
1

コードを難読化しても役に立たない理由は 2 つあります。

  1. ユーザーは、ブラウザからサーバーに送信されるメッセージを引き続き検査できます。また、メッセージが傍受されて変更されるのを防ぐために、何らかの方法でメッセージに署名する必要があります。通常、メッセージを生成するために使用される関数よりも、メッセージをアンパックする方が簡単です。
  2. 移動にかかった時間を測定しようとしています。つまり、難読化された関数は、システム クロックブラウザーの日付/時刻 API を信頼する必要があります。どちらも簡単に変更できます。

賢明な解決策は、サーバーでメッセージが送受信される時間を測定し、接続の遅延を測定して伝送速度を修正することです (非常に正確である必要がある場合)。

于 2012-08-23T21:31:40.473 に答える