Cómo evitar que el usuario final de una aplicación web cambie los valores en el tiempo de ejecución de JavaScript

Hay algunas respuestas largas, poco prácticas y malas con muchas advertencias (como la ofuscación), pero la respuesta corta es la mejor: no se puede. Cualquier persona con la habilidad técnica e interés para cambiar su JS del lado del cliente puede evitar la ofuscación. Planea a tu alrededor.

Ni siquiera es siempre algo negativo. A menudo abro la consola del desarrollador para ajustar cosas en sitios web y aplicaciones que están rotas, molestas o que podrían mejorarse. El ejemplo más reciente que se me ocurre fue eliminar una barra lateral en una aplicación web que presentaba molestos errores de diseño. También utilicé parches de aplicaciones que uso que tienen errores temporales (lo he hecho con Google Docs, Facebook, Evernote y G +, entre otras cosas). la mejor respuesta si tienes las herramientas para hacerlo). Hay complementos del navegador para ayudar a que estos cambios sean algo persistentes. Mejora mi experiencia de usuario y (generalmente) no tengo intención de hacer nada hostil.

Lo que está pidiendo es una forma de hacer que los objetos JavaScript sean de solo lectura. Esto ha sido posible en ES5 con Object.freeze. Aquí hay un ejemplo:

var o = {'foo': 'bar'};
o.foo; // "bar"
Object.freeze(o);
o.foo = 'baz';
o.foo; // "bar"

Entonces comenzamos con un objeto o que se inicializa para tener una propiedad foo con la bar valor.

Hacemos que el objeto sea inmutable pasándolo al método Object.freeze .

Intentamos mutar la propiedad del objeto con un nuevo valor, pero permanece sin cambios.


Como puede ver, es técnicamente posible evitar cambios a nivel de usuario en su JavaScript confiando en Object.freeze de ES5. Sin embargo, piense mucho sobre lo que realmente está logrando al hacer esto. ¿Qué es lo peor que puede suceder si el usuario altera el entorno de JavaScript en su cliente web personal?

La verdad es que la mayoría de los usuarios de la web no tienen idea de qué es JavaScript, y mucho menos el deseo de modificarlo en sitios web en vivo. La utilidad de cosas como bookmarklets y ciertas extensiones del navegador es que pueden mejorar o personalizar la funcionalidad de un sitio web. El costo de proteger su código puede no valer el beneficio de frustrar los esfuerzos de los usuarios para mejorar o personalizar su experiencia.

Realmente no hay forma de evitar esto. Simplemente está enviando JavaScript desde el servidor al cliente, y el cliente proporciona el tiempo de ejecución. El tiempo de ejecución puede ser cualquier cosa; en teoría, puede ser algo personalizado por el usuario, para hackear su sitio. Siempre debe suponer que cualquier cosa enviada desde el cliente podría haber sido manipulada.

Usted no Incluso si hubiera una manera de evitar cambios de valor en el lado del cliente, las solicitudes de regreso al servidor aún se pueden confundir.

Siempre valide lo que reciba en el servidor para asegurarse de que sea válido. En general, no debería necesitar enviar los datos que recibió del servidor de nuevo, por lo que lo que probablemente necesite validar es la información ingresada por el usuario en el contexto de otros datos que tiene en el servidor.

Re. la pregunta de desbordamiento de la pila vinculada: no creo que la mayoría de las páginas tengan una lista de nombres de usuario en el lado del cliente. Eso no escala bien en absoluto; podría funcionar si tiene dos o tres usuarios, pero comenzará a disminuir cuando tenga dos o tres mil.

Además, el problema con datos como ese es que debe estar actualizado: en una página ocupada, no hay garantía de que nadie más se haya registrado desde que cargó la página, por lo que la lista de nombres quedaría desactualizada rápidamente. Es poco probable que sea un problema, pero podría serlo.

Por lo general, las páginas que verifican si hay un nombre de usuario disponible hacen una solicitud en segundo plano (Ajax, sockets web o lo que sea) después de que el usuario haya ingresado un nombre; el servidor solo necesita decir sí o no, independientemente de cuántos nombres haya almacenado.

No hay manera Incluso si de alguna manera le dice a la página en particular que no permita que se cambien los valores, uno podría copiar el código fácilmente en una nueva página y hacer los cambios mientras está en forma de texto.


Realmente, la única razón por la que se necesita el servidor es por razones de seguridad. Si de alguna manera fuera posible evitar cambios de valor, entonces podríamos permitir que los navegadores se comuniquen directamente con la base de datos y el servidor sería completamente innecesario.


More Interesting

Creo que es demasiado tarde para comenzar a programar, quiero obtener un trabajo de desarrollador web junior lo más rápido posible, ¿qué debo hacer?

Cómo construir un sitio web desde el principio

Quiero crear un sitio web de compras en WordPress que dé acceso solo a miembros registrados y un miembro debe financiar su cuenta antes de comprar en el sitio. ¿Qué es un complemento que puede hacer esto?

Quería configurar el negocio del servidor para el alojamiento y el uso compartido de archivos, por lo que mi pregunta es cuánto cuesta un servidor y cuánto necesito para comenzar.

Estoy muy perdido tratando de aprender mi primer framework (Spring MVC). ¿Debo intentar aprender un marco más básico como Play o Struts primero?

Soy desarrollador de SQL y mi empresa me reembolsará los certificados de TI, pero estoy en el desarrollo web. ¿Cómo debo aprovecharlo?

Deseo ser un desarrollador front-end. ¿Cuál es el alcance de esto en India? ¿Qué habilidades se requieren para ser un desarrollador front-end?

Cómo evitar que una parte de la página esté oculta por una barra estática con CSS

Tengo un sitio web (http://awomkenneth.com/). Me gustaría hacerlo más popular en Nigeria. ¿Cómo lo logro?

Quiero aprender sobre diseño web. ¿Cuál es el futuro de PSD a CSS / HTML?

Necesito obtener algún tipo de concierto de programador / desarrollador. ¿Cuál es el mejor curso de acción para llegar allí?

Me gustaría comenzar un sitio de noticias sobre comediantes, ¿puedo publicar su standup en YouTube?

Estoy creando una firma de correo electrónico en HTML, pero está en línea a la izquierda y necesito que se extienda, de borde a borde del navegador. ¿Cómo puedo hacer eso?

Quiero entrar en la programación de servicios / aplicaciones web. ¿Dónde debo comenzar o qué temas debo analizar?

¿Hay alguna manera de establecer un calendario de recuperación de correos electrónicos en OS X?