Как иметь таймер, который нельзя изменить в javascript?

#javascript #jquery #timer

#javascript #jquery #таймер

Вопрос:

По сути, я разрабатываю приложение для викторины с ограниченным временем. Use выбирает ответ на вопрос, и следующий вопрос загружается с помощью Ajax-запроса. Ответы на все вопросы должны быть даны в течение, скажем, 2 минут.

Часы отсчитывают время, показывая, сколько времени осталось, и как только оно достигает 0, отображаются результаты. Теперь, поскольку таймер будет реализован с использованием window.setTimeout() , возможно, что значение timer variable будет изменено с помощью внешнего букмарклета или чего-то подобного. В любом случае, я могу это предотвратить? Я думаю, что это реализовано на сайтах обмена файлами, таких как megaupload. Любая подделка переменной timer приводит к отклонению запроса на файл.

Ответ №1:

.setTimeout() Вызовите метод AJAX на вашем сервере для синхронизации времени. Не полагайтесь на время клиента. Вы также можете сохранить время начала теста на сервере, а затем проверить время окончания при публикации теста.

Комментарии:

1. В первом было бы слишком много запросов ajax. Довольно пустая трата пропускной способности. Не так ли? Второй вариант кажется хорошим. С нетерпением буду ждать его реализации.

Ответ №2:

Вам нужно добавить проверку на стороне вашего сервера. Когда клиент хочет загрузить следующий вопрос с помощью Ajax-запроса, проверьте, наступил ли крайний срок.

Таймер на стороне клиента js — это просто уровень присутствия.

Ответ №3:

Если функция выполняется как выражение функции, вызываемое немедленно, то глобальных переменных нет, и локальному скрипту нечего ниспровергать. Конечно, ничто не мешает пользователю прочитать ваш код и сформулировать подделку, но все, что связано с 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);
}());