none
Como evitar acceso a archivo .js desde el navegador RRS feed

  • Pregunta

  • Tengo el siguiente escenario:

    Tengo un sitio web que clásicamente utiliza archivos .js, el problema es que si desde el navegador acceso directamente a la url del .js se puede visualizar todo el código de dicho archivo, por ejemplo si acceso a http://sitioweb.com/archivo.js, todo el codigo java script del archivo.js se muestra en el navegador, lo que quiero es que no se pueda acceder al archivo desde la url directamente ya que estos archivos .js pueden tener información confidencial.

    Se que el archivo .js a la larga si o si tiene que descargarse al navegador para su ejecutar sus funciones, pero quiero evitar el acceso directo a dicho archivo.

    Saludos.


    Roy Sillerico


    jueves, 24 de noviembre de 2016 19:43

Respuestas

  • [...] se utiliza un archivo .js para encriptar el pass, una vez encriptado recien viaja al servidor, es por eso que la confidencialidad de este .js es critico

    ¿Por qué va a ser crítica la confidencialidad de ese .js? Lo que es crítico es la confidencialidad de la password, no del .js. Me imagino que no estarás cifrando con un algoritmo secreto, eso es una mala práctica. Usa siempre un algoritmo de cifrado bien conocido, cuya fiabilidad haya sido demostrada mediante escrutinio público.

    Si se desea seguridad, no se transmite la propia clave encriptada, sino que se usa un sistema de desafío/respuesta. Consiste en que desde el servidor se envía un número aleatorio al navegador. El navegador cifra ese número aleatorio usando como clave la contraseña del usuario, y se envía el resultado al servidor. El servidor puede verificarlo porque sabe el número aleatorio que envió y sabe la clave del usuario, con lo que puede repetir el mismo cálculo y ver si coinciden los resultados. Se debe usar https para servir el javascript que realiza ese cálculo, no por mantenerlo confidencial, que no es necesario porque para el cálculo se usa un algoritmo público, sino para evitar un "ataque del hombre en el medio" que sustituya el fichero por otro distinto.

    jueves, 24 de noviembre de 2016 21:17

Todas las respuestas

  • Olvídalo, no se puede. En última instancia, el navegador va a necesitar descargar el archivo para poderlo ejecutar. Y la forma en que el navegador lo descarga es enviando un GET al servidor. El servidor no tiene forma de discernir si ese GET viene de la página que tiene dentro el javascript o de una petición enviada manualmente por un usuario. E incluso aunque se pudiera distinguir, una vez que el navegador lo tiene cargado para ejecutarlo lo puedes ver con las F12. No solo se puede ver, sino que incluso puedes copiarlo, modificarlo, y ejecutarlo paso a paso con el depurador. También se puede ver en una captura de red, bien sea hecha con las F12 o con otra herramienta tal como el Wireshark.

    Así que si tienes información confidencial, no la embebas en un javascript. Déjala en lado servidor, y transmite al navegador únicamente el resultado final que tenga que ser visto por el usuario.

    jueves, 24 de noviembre de 2016 20:00
  • OK entendido, pero tengo este escenario: Tengo un login, del cual el pass debe estar encriptado, esta pass no debe viajar el texto claro hacia el servidor, es por eso que se utiliza un archivo .js para encriptar el pass, una vez encriptado recien viaja al servidor, es por eso que la confidencialidad de este .js es critico. Bueno imagino que no debo estar tomando el mejor camino, pero entonces como lo hago? ya que como ya lo dije la contraseña no debe viajar en claro desde el cliente hacia el servidor.

    Roy Sillerico

    jueves, 24 de noviembre de 2016 20:10
  • [...] se utiliza un archivo .js para encriptar el pass, una vez encriptado recien viaja al servidor, es por eso que la confidencialidad de este .js es critico

    ¿Por qué va a ser crítica la confidencialidad de ese .js? Lo que es crítico es la confidencialidad de la password, no del .js. Me imagino que no estarás cifrando con un algoritmo secreto, eso es una mala práctica. Usa siempre un algoritmo de cifrado bien conocido, cuya fiabilidad haya sido demostrada mediante escrutinio público.

    Si se desea seguridad, no se transmite la propia clave encriptada, sino que se usa un sistema de desafío/respuesta. Consiste en que desde el servidor se envía un número aleatorio al navegador. El navegador cifra ese número aleatorio usando como clave la contraseña del usuario, y se envía el resultado al servidor. El servidor puede verificarlo porque sabe el número aleatorio que envió y sabe la clave del usuario, con lo que puede repetir el mismo cálculo y ver si coinciden los resultados. Se debe usar https para servir el javascript que realiza ese cálculo, no por mantenerlo confidencial, que no es necesario porque para el cálculo se usa un algoritmo público, sino para evitar un "ataque del hombre en el medio" que sustituya el fichero por otro distinto.

    jueves, 24 de noviembre de 2016 21:17