Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

350
Vistas
Temporizador de cuenta regresiva no pirateable de JavaScript

Actualmente estoy trabajando en una aplicación de prueba. Cuando aparece una pregunta, los usuarios tienen 10 segundos para responderla, de lo contrario no obtienen los puntos por esa pregunta. Una vez que se acabe el tiempo, quiero pasar automáticamente a la siguiente pregunta. Actualmente estoy enfrentando problemas sobre cómo hacer que el cliente no pueda "hackear" el temporizador de cuenta regresiva de 10 segundos.

Mi idea inicial era usar algo similar a setTimeout() en el lado del cliente durante 10 segundos y, una vez que se completa el temporizador, pedirle al servidor que obtenga la siguiente pregunta. El problema con esto es que el temporizador del lado del cliente se puede piratear/modificar para que se ejecute durante más de 10 segundos, lo que podría dar a algunos usuarios más de 10 segundos para responder la pregunta.

 client <--- sends question --- server | start timer for 10 seconds (as this is client-side, it could easily be extended) | . 10 seconds later . V client --- ask for next question / send answer ---> server

Para mantenerlo imposible de piratear, pensé en mover la lógica de verificación de tiempo al lado del servidor. Esto implicaría mantener dos variables ( A y B ) en el lado del servidor por usuario conectado, una que representa la hora en que se envió la pregunta y la otra que representa la hora en que se dio la respuesta. El temporizador del lado del cliente aún se ejecutaría, excepto que el lado del servidor usa las marcas de tiempo para realizar alguna validación para verificar si la diferencia entre las marcas de tiempo A y B excede los 10 segundos:

 client <--- sends question --- server (send question at timestamp `A`) | start timer for 10 seconds (as this is client-side, it could easily be extended) | . 10 seconds later . V client --- ask for next question / send answer ---> server (receive request at timestamp `B`) | +-----------------------------------------------------+ v server logic: duration = B - A if(duration > 10 seconds) { // allocated time exceeded }

Sin embargo, veo algunos defectos potenciales con esto. El tiempo que tarda la pregunta en llegar al cliente desde el servidor y el tiempo entre el momento en que el servidor envió la pregunta (tiempo A ) y el momento en que se inicia el temporizador del lado del cliente no será instantáneo y dependerá del ping. / conexión que el usuario tiene con el servidor. Existen problemas de ping similares cuando el cliente solicita la siguiente pregunta. Además, me preocupa que si el temporizador del lado del cliente, que se supone que debe ejecutarse durante 10 segundos, se retrase un poco, también podría causar que falle la verificación del lado del servidor. Como resultado, verificar si la duración excedió los 10 segundos no es suficiente y requeriría un búfer adicional. Sin embargo, siento que codificar arbitrariamente el búfer a algo así como 1 o 2 segundos podría generar problemas y se siente como una solución alternativa que no es muy sólida.

Pregunta: Me pregunto si hay un enfoque diferente que me falta para mantener el temporizador del lado del cliente inviolable y preciso. También quiero tratar de evitar la creación de temporizadores separados con setTimeout() o similares para cada usuario conectado en el lado del servidor, ya que muchos usuarios podrían estar conectados en un momento dado, y tener tantos temporizadores en cola en el servidor se siente sin recursos También quiero tratar de mantener al mínimo la cantidad de mensajes que se envían entre el cliente y el servidor.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Qué tal una galleta?

Establecer una cookie con un token único. Establezca su vencimiento ahora()+15 segundos. Guarde el token y el tiempo en el lado del servidor. Mantenga su temporizador del lado del cliente funcionando con un envío automático después de 10 segundos.

Cuando llega la respuesta, si no hay ninguna cookie... Sin duda significa que la respuesta se envió después de la demora (y el temporizador fue pirateado).

Por lo tanto, se supone que un tiempo de caducidad de la cookie de ahora () + 10 segundos + un período de gracia de ~ 5 segundos adicionales es suficiente para compensar los retrasos de HTTP.

Si piratean el temporizador, la cookie debería haber caducado (y eliminado). Si también piratean la caducidad de la cookie (!), De todos modos, el token se utilizará para recuperar la fecha y hora del envío de la pregunta y la comparará con la fecha y hora de la respuesta recibida.

over 4 years ago · Santiago Trujillo Denunciar

0

En lugar de iniciar el reloj en el servidor cuando se envía la pregunta. Puede iniciar el reloj en el servidor cuando la pregunta se muestra al usuario (en el cliente).

  • Mantenga 2 relojes, uno en el cliente y otro en el servidor.
  • Marca de tiempo cada solicitud sensible al tiempo ( Start quiz timer y End quiz timer y verificar si la discrepancia de marca de tiempo está dentro de la tolerancia aceptable.

Problema de sincronización de la aplicación Quiz

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda