2011-10-31 13 views
3

基本的には、限られた時間でクイズアプリケーションを設計しています。質問に答えを選択すると、Ajaxリクエストを使用して次の質問が読み込まれます。すべての質問には、例えば2分という時間枠内で回答する必要があります。JavaScriptを使ってタイマーを修正する方法はありますか?

時間がずれて表示され、0になるとすぐに結果が表示されます。タイマーはwindow.setTimeout()を使用して実装されるので、外部ブックマークレットなどを使用してtimer variableの値を変更する可能性があります。とにかく私はこれを防ぐことができますか?私はこれがmegauploadのようなファイル共有サイトに実装されていると思います。タイマー変数を偽造すると、ファイルが拒否される要求が発生します。

答えて

1

.setTimeout()あなたのサーバーでAJAXメソッドを呼び出して時刻を同期させます。クライアントの時間に頼らないでください。また、クイズの開始時刻をサーバーに保存し、クイズが送信されたときの終了時刻を確認することもできます。

+0

最初の1つでは、あまりにも多くのajaxリクエストがあります。かなりの帯域幅の無駄。ではない? 2番目は良いと思われる。それを実現することを楽しみにしています。 – Shubham

1

サーバー側で検証を追加する必要があります。クライアントがAjaxリクエストを使用して次の質問をロードする場合は、期限が到着したかどうかを確認します。

クライアントサイドのタイマーはプレゼンテーションレイヤーです。

1

関数が直ちに呼び出される関数式として実行される場合、グローバル変数はなく、ローカルスクリプトが破壊されることはありません。もちろん、ユーザーがあなたのコードを読んで偽装するのを止めるものは何もありませんが、javascriptとは何かがこのような攻撃に公開されています。

他の人は言っているように、クロックに基づいて要求を検証するためにサーバーを使用しますが、保証するためにサーバーに依存しないでください。ここでは開始時間からの単純なカウントダウンがあります。そのため、デイリー実行の試みは機能しません。どちらの場合も、リセットまたは変更するグローバル変数はありません。

(function(){ 

    // Place to write count down 
    var el = document.getElementById('secondsLeft'); 
    var starttime, 
     timeout, 
     limit = 20; // Timelimit in seconds 

    // Function to run about every second 
    function nextTick() { 
    var d = new Date(); 

    // Set start time the first time 
    if (!starttime) starttime = d.getTime(); 

    var diff = d.getTime() - starttime; 

    // Only run for period 
    if (diff < (limit * 1000)) { 
     el.innerHTML = limit - (diff/1000 | 0); 

    } else { 

     // Time's up 
     el.innerHTML = 0; 
     clearTimeout(timeout); 
    } 
    } 

    // Kick it off 
    timeout = window.setInterval(nextTick, 1000); 
}()); 
関連する問題