ユーザーが何かをするのに必要な時間を測定する必要がある Web アプリに取り組んでいます。ユーザーがシステム時間を変更してアプリをごまかす可能性があるため、javascript time オブジェクトを単純に使用することはできません。これを防ぐには何らかの方法が必要です。
4 に答える
サーバー側で時間を計算します。
クライアントユーザーはそれで混乱することはできません(少なくともできるはずはありません)
Web アプリがハートビートまたはその他の形式の信号をサーバー側に送り返すようにします。次に、次のようないくつかのメトリックを構築できますduration = end - start
クライアントとサーバー間の往復通信を考慮すると、これはミリ秒単位の解像度測定には明らかに適していません。
注 :「信頼できる」Web サービスからクライアント側アプリに時刻を読み取るだけでは、アプリがそれを調整しないとは保証できません。(クライアント側の取引における基本的なルールの 1 つは、その入力を信頼しないことです。たとえば、検証のために、サーバー側の検証が必要です)。ただし、サーバーにシグナルを送信し、サーバーのクロックを使用してそのタイムスタンプをログに記録するだけであれば、はるかに安全です。
次に、サーバー側でそれを行う必要があります。クライアントで起こることはすべて操作可能です。
1 つの方法は、ajax 呼び出しを行い、php またはその他のサーバー側スクリプトで時間を測定することです。
これの多くは、必要な時間測定精度に依存します。
長い時間 (1 分以上) を測定していて、1 分以内の精度が必要な場合は、ajax 呼び出しを使用してリモート サーバーの時刻をフェッチする方が、クライアント側のクロック測定よりも明らかに確実です。
1 分未満でより短い時間を測定しようとしている場合は、何らかの精度を達成するためにローカル クロックを使用する必要があります。そのために、次の型アルゴリズムを使用して、ローカル コンピューターのクロックが乱れているかどうかを確認できます。
- サーバーにリモート リクエストを送信して、現在の時刻を取得します。これは、公開されている時間リソースまたは独自のサーバーのいずれかです。
- ローカル コンピューターの現在の時刻を取得します。
- これら 2 つの時間の間のオフセットを計算します。あなたが探しているのは、オフセットに大きな変化がないことです。
- ローカル コンピューターの時刻を使用して、ローカル操作の開始をマークします。
- ユーザーが操作を行います。
- ローカル コンピューターの現在の時刻を取得して、ローカル操作の終了をマークします
- リモート時刻を再度取得します。
- ローカル コンピューターの現在の時刻を取得する
- ローカル時間とサーバー時間の間のオフセットを計算します。リモート時刻を取得するのにかかった時間のわずかな違いを考慮して、その差が以前に計算された差と相対的に同じであるかどうかを確認します。この差が同じでない場合は、ローカル クロックが台無しになっています。
リモート時刻を瞬時に取得することはできないため (取得には不確定な遅延時間が常に存在します)、ローカル クロックが台無しにされていないことを確認する際に数秒の固有の不正確さがあることに注意してください。不正確さは、ローカルの動作を測定することではなく、ローカル クロックが台無しにされていないことを確認することです。
したがって、この手法は、数秒以上の時計操作を検出するのに最適であり、小さな操作ではありません。