Si bien la respuesta anterior explica cómo hacer esto, ya que parece ser un problema de demostración, probablemente sea beneficioso dar un poco más de explicación sobre por qué funciona.
Este ejemplo parece ser una demostración de la debilidad del código del lado del cliente. En redes públicas, como Internet, las computadoras cliente casi nunca son confiables. No sabe si son un atacante o un usuario legítimo e incluso cuando es un usuario legítimo, no sabe si pueden estar infectados con algún malware que le otorga a un atacante acceso compartido a su sistema.
Como tal, cualquier seguridad por la que presione "lado del cliente" y dependa de que el cliente se comporte bien se rompe fácilmente. En este caso, el filtrado de entrada se realizó del lado del cliente. En el mundo real, a menudo se ve esto hecho para proporcionar una respuesta más rápida si el usuario comete un error. La validación del lado del servidor es segura, pero solo se puede realizar cuando el cliente decide enviar información. La verificación del lado del cliente puede detectar un problema de una manera e informar al usuario antes de que pierda demasiado tiempo.
La validación del lado del cliente no es mala para la funcionalidad de usabilidad, pero es importante recordar que cualquier funcionalidad del lado del cliente no proporciona mucha, si es que alguna, seguridad adicional significativa. Por ejemplo, se pueden hacer varias iteraciones de un hash de contraseña del lado del cliente, pero luego un atacante podría simplemente enviar suposiciones que omitan el proceso de hashing en el cliente y adivinar la entrada directamente. De manera similar, como lo demuestra este problema, la validación de entrada de Javascript puede eliminarse completamente de manera trivial.
Toda la validación de los problemas de seguridad siempre debe hacerse en un código de confianza y, con pocas excepciones, el código de confianza significa que se ejecuta en el servidor para el que controla el hardware.