2015-05-02 2 views
0

Я хочу измерить время, необходимое пользователю для выполнения задачи (ответьте на викторину). Я хочу точно его измерить, без сетевого отставания. Смысл, если я измеряю на стороне сервера время между двумя запросами, это не будет в реальном времени, когда это заняло бы пользователя, потому что время сети учитывается.Как безопасно измерять время пользователя

Но, с другой стороны, если я измеряю в javascript и отправить метки времени на сервер, пользователь сможет увидеть код и обмануть, отправив ложные метки времени, нет?

Как я могу получить метки времени в javascript и убедиться, что пользователь не подделывает его?

+4

Вы не можете! Независимо от того, что вы пытаетесь, javaScript является клиентской стороной, и его код отображается опытному пользователю - он всегда может найти способ отправки измененных временных меток. Ваш сервер должен выполнить измерение времени. Что касается латентности - как вы думаете, ваша игра в викторине будет страдать от отставания в 50 мс или что-то в этом диапазоне? – luk2302

ответ

4

Как правило, на стороне клиента на любой вопрос, который начинается с «Как надежно ...», отвечает «Невозможно». Ничего, даже не помещая переменные в закрытие (потому что я, злой пользователь мошенничества, мог просто изменить код на моем конце и отправить его обратно вам).

Это вид проверки, который должен выполняться на стороне сервера, даже с недостатком латентности сети.

3

Уловкой здесь будет измерение времени с помощью JavaScript, но также отслеживание его с использованием кода на стороне сервера. Таким образом, вы можете рассчитывать на отметки времени, полученные клиентом, если вы применяете максимальную разницу между расчетными временами. Я бы сказал, что несколько секунд должно быть достаточно хорошим. Однако при этом вы создаете дополнительный вектор для отказа.

Редактировать: Пользователь может потенциально настроить свое время в свою пользу на максимальную вынужденную разницу, если они могут воспользоваться (отсутствием) сетевого отставания.

+0

Какое преимущество дает знание времени дельта между значением сервера и ненадежным значением из кода клиента? – jdphenix

+0

@jdphenix Ну, реалистично, это викторина. Все OP хочет сделать, это получить точное измерение времени, затраченного на завершение викторины, которое может быть получено только от ненадежного клиента. Однако, если вы действительно думаете об этом, этот метод будет эффективно защищать от вредоносного использования. Это не алгоритм, предназначенный для защиты сверхсекретных документов NSA. Просто измерение времени. Иногда разумнее просто подумать о решении, которое соответствует сценарию. Вот что это. –

1

Я столкнулся с такой же проблемой при разработке портала онлайн-экзаменов для моего проекта. Я пошел на гибридный подход.

  1. Получите время от сервера, так как пользователь загружает страницу и запускает таймер на основе javascript. Запишите время начала в базе данных.
  2. Позвольте таймеру работать на стороне клиента в течение некоторого времени, скажем, 30 секунд.
  3. Обновите таймер, выполнив вызов AJAX на сервер для сброса таймера по времени, прошедшему уже.
  4. ПРИМЕЧАНИЕ. Попробуйте использовать внешний javascript и сфотографировать код таймера, чтобы затруднить угадывание.

Таким образом, вы не можете полностью запретить пользователю изменять таймер, но вы можете ограничить максимальную возможную ошибку до 30 секунд.

Смежные вопросы