Estoy creando un contador JS para un sitio web de exámenes, descubrí que pueden agregar tiempo adicional muy fácilmente en la consola ejecutando sec += 10000 , ¿cómo puedo detener esto?
estoy usando laravel en el backend
runCounter(); function runCounter() { let min = 45; let sec = min * 60; let x = setInterval(function() { console.log(secFormat(sec)) sec -= 1; if (sec <= 0) { endExam(); clearInterval(x); } }, 1000); } function secFormat(x) { x = Number(x); let h = Math.floor(x / 3600); let m = Math.floor(x % 3600 / 60); let s = Math.floor(x % 3600 % 60); m += h * 60; if (m < 10) { m = "0" + m } if (s < 10) { s = "0" + s } return m + ":" + s; } function endExam() { alert('exma ended'); }Simple: en su proyecto Laravel, almacena la hora en que el usuario comenzó el examen y crea un trabajo cron que se ejecutará periódicamente y verificará si transcurrió el tiempo de los exámenes. Si es así, trate ese examen como fallido, ya que el usuario no envió las respuestas a tiempo.
No tendrá que preocuparse entonces por cómo el usuario puede cambiar el código JS, ya que si el servidor sabe cuándo ha comenzado el examen, entonces es irrelevante lo que el estudiante o el navegador afirman.
Su principal problema es que su sitio web asume que el navegador del usuario tiene información precisa. Pero el usuario podrá cambiar el código JS a su antojo.
Puede hacerlo más difícil para sus usuarios envolviendo una función alrededor de todo su Javascript, como
function() { //your JS code }();en cuyo caso al menos sus funciones no estarán en un contexto global. Pero eso también se puede hackear.
Déjame explicarte por qué no puedes evitar que esto suceda de ninguna manera:
Aún más fácil: el usuario puede simplemente poner un punto de interrupción en algún lugar del código Javascript mientras piensa en las soluciones y entonces su tiempo nunca pasará.
Nunca confíes en los datos del usuario.
Ponga su función en la función autoejecutable como se muestra a continuación
(function runCounter() { let min = 45; let sec = min * 60; let x = setInterval(function() { console.log(secFormat(sec)) sec -= 1; if (sec <= 0) { endExam(); clearInterval(x); } }, 1000); } )();por lo que sus variables se vuelven privadas para el entorno externo, es decir, para la consola