javascript - produccion - Distribución segura de aplicaciones NodeJS
nodebeginner español (5)
Qué: ¿Se pueden distribuir las aplicaciones NodeJS como binarias? es decir. compila la aplicación .js a través de V8 en su binario nativo, y distribuye el binario a los clientes? (si tiene acceso total al servidor NodeJS) ... ¿o está minificando el código todo lo que puede hacer?
Por qué: creamos aplicaciones en el servidor en NodeJS para los clientes, que a menudo deben alojarse en los servidores del cliente. La distribución del código fuente significa que los clientes pueden robar fácilmente nuestra solución y dejar de pagar tarifas de licencia. Esto abre la posibilidad de una fácil ingeniería inversa o reutilización de nuestras aplicaciones sin nuestro conocimiento.
Actualmente estoy investigando lo mismo y estoy mirando a nexe que afirma ser capaz de "crear un solo ejecutable de tus aplicaciones node.js".
No puedo decirte si todavía está bien, pero pensé que valdría la pena compartirlo.
Sí, es posible, utilice esta branch (en base a 0.8.18) y cualquier código js que ponga en ''deps / v8 / src / extra-snapshot.js'' se compilará por adelantado en el código máquina e incrustado en v8 como parte de la inicialización del objeto incorporado normal. Deberá construir nodejs para cada plataforma en la que desee implementar su producto.
El código capturado se ejecuta muy temprano en la inicialización de v8 y no puede acceder a los objetos incorporados en el ''cuerpo del módulo''. Lo que puede hacer es colocar todo su código dentro de una función de inicialización global para llamarlo más tarde. Ex:
// ''this'' points to the same as the object referenced by
// ''global'' in normal nodejs code.
// at this point it has nothing defined in it, so in order to use
// global objects a reference to it is needed.
var global = this;
global.initialize = function() {
// You have to define all global objects you use in your code here;
var Array = global.Array;
var RegExp = global.RegExp;
var Date = global.Date;
// See ECMAScript v5 standard global objects for more
// Also define nodejs global objects:
var console = global.console;
var process = global.process;
// Your code goes embedded here
};
Además, esto supone que todo su código está definido en un solo archivo, por lo que si su proyecto utiliza el sistema de módulo nodejs (requiere), debe escribir un script que combine todos sus archivos en uno y ajuste cada archivo en un cierre que engañe a su código para pensar que es un módulo nodejs normal. Probablemente, cada cierre de módulo expondría una función requerida, y esta función tendría que decidir cuándo delegar en el estándar ''global.require'' o devolver las exportaciones de sus otros módulos integrados. Vea cómo se implementan los sistemas de módulos javascript para ideas (requirejs es un buen ejemplo).
Esto hará que su código sea más difícil de depurar ya que no verá rastros de pila para el código nativo.
ACTUALIZAR:
Incluso usando snapshots v8, el código se incrusta en el binario node.js porque v8 prefiere la compilación diferida. Vea this para más información.
Sí, puedes crear un formato binario. V8 le permite precompilar JavaScript. Tenga en cuenta que esto podría tener un montón de efectos secundarios extraños sobre las suposiciones hechas por el nodo central.
La distribución del código fuente significa que los clientes pueden robar fácilmente nuestra solución y dejar de pagar tarifas de licencia.
El hecho de que distribuya el binario no lo protege contra el robo de los mismos. Todavía pueden robar el código binario o desmontarlo. Esto es protección a través de la oscuridad que no es protección en absoluto.
Es mejor darles una aplicación de cliente ligero que hable con su servidor y mantener el código de su servidor seguro no entregándolo.
V8 genera el código máquina nativo internamente y lo ejecuta. Mire aquí: https://github.com/v8/v8-git-mirror/blob/master/src/compiler.cc#L1178 . Esta característica se usa en EncloseJS . EncloseJS analiza las fuentes de su proyecto node.js, agrupa las dependencias y crea un archivo binario ejecutable. Las fuentes no están incluidas en el código de máquina compilado solo en binario.
Obtienes un binario completamente funcional sin fuentes.
El código JavaScript se transforma en código nativo en tiempo de compilación utilizando el compilador interno V8. Por lo tanto, sus fuentes no están obligadas a ejecutar el binario, y no están empaquetadas.
El código nativo perfectamente optimizado se puede generar solo en tiempo de ejecución basado en la máquina del cliente. Sin esa información, EncloseJS solo puede generar código "no optimizado". Se ejecuta aproximadamente 2 veces más lento que NodeJS.
Además, el código de tiempo de ejecución node.js se coloca dentro del ejecutable (junto con su código) para admitir la API del nodo para su aplicación en tiempo de ejecución.
Casos de uso:
- Haga una versión comercial de su aplicación sin fuentes.
- Haga una versión demo / evaluación / prueba de su aplicación sin fuentes.
- Crea algún tipo de archivo o instalador autoextraíble.
- Cree una aplicación GUI de fuente cerrada utilizando node-thrust.
- No es necesario instalar node y npm para implementar la aplicación compilada.
- No es necesario descargar cientos de archivos a través de la instalación de npm para implementar su aplicación. Implementarlo como un único archivo independiente.
- Coloque sus activos dentro del ejecutable para hacerlo aún más portátil. Pruebe su aplicación contra la nueva versión de nodo sin instalarla.