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

Decidí que quiero aprender PHP. ¿Para qué se usa PHP exactamente en el desarrollo web front-end?

Quiero convertirme en un comercializador de Internet. ¿Debo aprender HTML o JavaScript primero?

Me encanta la forma en que el texto se desliza en este sitio http://riiotlabs.com/fr/accueil. ¿Se logra esto usando js css? ¿Qué tutorial puede ser de ayuda?

Empecé a aprender HTML / CSS / JavaScript por mi cuenta, pero estoy más interesado en otros lenguajes como Python y PHP. ¿Es realista pensar que puedo llegar a algún lugar como Amazon o cualquiera de las otras compañías tecnológicas en el área de Seattle?

¿Puede uno ser un desarrollador de software y web (front-end) si comenzó a practicar en su adolescencia (14)? Si es así, ¿será difícil ser ambos?

¿Soy considerado un programador si soy desarrollador web?

¿Por qué necesito un servidor web?

Tengo 32 años, ¿qué habilidades puedo aprender para ser un desarrollador independiente?

Soy un desarrollador de PHP, ¿debería aprender Ruby on Rails o Python Django?

He comprado un nombre de dominio en GoDaddy.com y quiero alojar mi sitio web en él. ¿a donde voy desde aqui?

Cómo insertar automáticamente un Google HangoutsOnAir, en mi sitio web donde realmente puedes iniciar un Hangouts privado desde el sitio web y usar aplicaciones

Después de mucha investigación, decidí construir mi sitio web usando Drupal. ¿Cómo puedo determinar la estructura de mi sitio web (métodos y técnicas clásicas)? ¿Cuáles son los pasos necesarios para crear un sitio web con Drupal (sitios web o libros para consultar)?

Me estoy enseñando a codificar como un hobby y sé HTML, CSS y algunos jQuery / JS. ¿Cuáles son algunos proyectos front-end que podría intentar construir para ponerme a prueba?

Quiero tener un control total sobre el aspecto de mi portafolio \ blogging y agregar mis propias características especiales, pero no soy excelente con el diseño. ¿Recomendarías Bootstrap o WordPress?

Cómo crear un sitio web de búsqueda de salarios como Indeed.com