Pregunta ¿Cómo puedo ofuscar (proteger) JavaScript? [cerrado]


Quiero hacer una aplicación de JavaScript que no sea de código abierto, y por lo tanto, ¿me gustaría aprender a ofuscar mi código JS? es posible?


662
2017-10-11 18:17


origen


Respuestas:


Ofuscación:

Tratar Compresor YUI. Es una herramienta muy popular, construida, mejorada y mantenida por el equipo de Yahoo UI.

También puedes usar:

Datos de cadena privada:

Mantener los valores de las cadenas en privado es una preocupación diferente, y la ofuscación no será de mucho beneficio. Por supuesto, al empaquetar su fuente en un lío confuso y minificado, tiene una versión ligera de seguridad mediante oscuridad. La mayoría de las veces, es su usuario quien está viendo la fuente, y los valores de cadena en el cliente están destinados para su uso, por lo que ese tipo de valor de cadena privada no suele ser necesario.

Si realmente tuvieras un valor que nunca quisiste que un usuario vea, tendrías un par de opciones. En primer lugar, podría hacer algún tipo de cifrado, que se descifra en la carga de la página. Esa sería probablemente una de las opciones más seguras, pero también una gran cantidad de trabajo que puede ser innecesario. Probablemente podrías base64 codificar algunos valores de cadena, y eso sería más fácil ... pero alguien que realmente quisiera esos valores de cadena podría descifrarlos fácilmente. La encriptación es la única forma de evitar realmente que alguien acceda a sus datos, y la mayoría de las personas considera que se necesita más seguridad de la que necesitan.

Nota al margen:

Se sabe que la ofuscación en Javascript causa algunos errores. Los ofuscadores están mejorando un poco, pero muchos equipos deciden que ven suficiente beneficio de minificando y gzippingy los ahorros adicionales de ofuscación no siempre vale la pena el problema. Si intenta proteger su fuente, tal vez decida que vale la pena, solo para hacer que su código sea más difícil de leer. JSMin es una buena alternativa


387
2017-10-11 18:21



Me sorprende que nadie haya mencionado Google Compilador de cierre. No solo minimiza / comprime, sino que analiza para encontrar y eliminar el código no utilizado, y reescribe para la máxima minificación. También puede hacer una verificación de tipo y advertirá sobre los errores de sintaxis.

JQuery recientemente cambió de YUI Compresser a Closure Compiler, y vio un "mejora sólida"


129
2018-04-17 15:14



La ofuscación nunca puede funcionar realmente. Para cualquiera que realmente quiera acceder a su código, es solo un aumento de velocidad. Peor aún, evita que los usuarios solucionen errores (y le devuelvan las correcciones), y hace que sea más difícil para usted diagnosticar problemas en el campo. Es una pérdida de tiempo y dinero.

Habla con un abogado sobre la ley de propiedad intelectual y cuáles son tus opciones legales. "Fuente abierta" no significa que "las personas puedan leer la fuente". En cambio, Open Source es un modelo de licencia particular que otorga permiso para usar y modificar libremente su código. Si no otorga dicha licencia, entonces las personas que copian su código están en violación y (en la mayor parte del mundo) tiene opciones legales para detenerlos.

La única forma en que realmente puedes proteger tu código es no enviarlo. Mueva el código importante del lado del servidor y haga que su código Javascript público haga llamadas Ajax.

Vea mi respuesta completa sobre ofuscadores aquí.


115
2017-10-25 23:24



Puede ofuscar la fuente de JavaScript todo lo que quiera, pero siempre será de ingeniería inversa simplemente requiriendo que todo el código fuente se ejecute realmente en la máquina cliente ... la mejor opción que puedo pensar es tener todo el procesamiento hecho con el código del lado del servidor, y todo el código del cliente que javascript hace es enviar solicitudes para el procesamiento al servidor mismo. De lo contrario, cualquiera siempre podrá realizar un seguimiento de todas las operaciones que está haciendo el código.

Alguien mencionó a base64 para mantener las cuerdas a salvo. Esta es una idea terrible Base64 es inmediatamente reconocible por los tipos de personas que desearían realizar ingeniería inversa de su código. Lo primero que harán es descodificarlo y ver qué es.


50
2017-10-11 19:21



Hay una serie de herramientas de ofuscación de JavaScript que están disponibles gratuitamente; Sin embargo, creo que es importante tener en cuenta que es difícil ofuscar JavaScript hasta el punto en que no se puede modificar por ingeniería inversa.

Con ese fin, hay varias opciones que he utilizado hasta cierto punto en el tiempo extra:

  • Compresor YUI. El compresor de JavaScript de Yahoo! Hace un buen trabajo al condensar el código que mejorará su tiempo de carga. Hay un pequeño nivel de ofuscación que funciona relativamente bien. Básicamente, Compressor cambiará los nombres de las funciones, eliminará el espacio en blanco y modificará las variables locales. Esto es lo que uso más a menudo. Esta es una herramienta de código abierto basada en Java.

  • JSMin es una herramienta escrita por Douglas Crockford que busca minimizar tu fuente de JavaScript. En las propias palabras de Crockford, "JSMin no se ofusca, pero sí lo hace". Su principal objetivo es minimizar el tamaño de su fuente para una carga más rápida en los navegadores.

  • Obfuscator gratuito de JavaScript. Esta es una herramienta basada en web que intenta ofuscar su código codificándolo realmente. Creo que las compensaciones de su forma de codificación (u ofuscación) podrían ser a costa del tamaño del archivo; sin embargo, esa es una cuestión de preferencia personal.


44
2017-10-11 18:26



Que haría yo:

A. Troll el hacker!

Esto será en la segunda parte de mi código de JavaScript secreto falso / ofuscado LANZADOR. El que ves en el código fuente.

¿Qué significa este código?

  1. carga el código real
  2. establece un encabezado personalizado
  3. publica una variable personalizada

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

SEGUNDO. Ofuscar el código un poco

¿Que es eso?

  1. ese es el mismo código que el anterior en base64
  2. este no es el código javascript SECRETO

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

do Crea un archivo php difícil de visualizar con el código real dentro

¿Qué hace este código php?

  1. Verifica la referencia adecuada (dominio / dir / código de tu lanzador)
  2. Comprueba el HEADER personalizado
  3. Verifica la variable POST personalizada

Si todo está bien, le mostrará el código correcto, de lo contrario, un código falso o prohibición de IP, cerrar página ... lo que sea.

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

base64 referente = http://here.is/my/launcher.html

SECRETO javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FALSO = window.open('', '_self', '');window.close();

Ahora ... si defines manejadores de eventos en el javascript SECRETO, probablemente sea accesible ... necesitas definirlos afuera con el código de lanzamiento y apuntando a una función SECRETA anidada.

ASÍ ... ¿hay una manera fácil de obtener el código? document.body.appendChild(document.createElement('div')).innerText='Awesome';

No estoy seguro de si esto funciona, pero estoy usando Chrome y revisé Elementos, Recursos, Red, Fuentes, Línea de tiempo, Perfiles, Auditorías, pero no encontré la línea anterior.

nota 1: si abre la url Troll.php desde Inspeccionar elemento-> red en cromo obtiene el código falso.

nota 2: todo el código está escrito para navegadores modernos. polyfill necesita mucho más código.

EDITAR

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Troll.php

<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>

21
2017-07-04 11:12



El problema con los lenguajes interpretados es que usted envía la fuente para que funcionen (a menos que tenga un compilador de bytecode, pero una vez más, es bastante trivial para descompilar).

Entonces, si no quiere sacrificar el rendimiento, solo puede actuar sobre los nombres de variables y funciones, por ej. reemplazándolos por a, b ... aa, ab ... o a101, a102, etc. Y, por supuesto, elimine la mayor cantidad posible de espacios / líneas nuevas (eso es lo que los denominados compresores JS).
La ofuscación de cadenas tendrá un impacto en el rendimiento, si tiene que encriptarlas y descifrarlas en tiempo real. Además, un depurador JS puede mostrar los valores finales ...


17
2017-10-11 18:23



Al contrario de la mayoría de las otras respuestas que sugiero contra YUI Compressor; Deberías usar Cierre de Google.

No mucho porque se comprime más, pero sobre todo porque detectará errores de javascript como a = [1,2,3,]; que hacen que IE se vuelva loco.


17
2017-08-22 12:44



Tratar JScrambler. Lo hice girar recientemente y me impresionó. Proporciona un conjunto de plantillas para la ofuscación con configuraciones predefinidas para aquellos a quienes no les importan demasiado los detalles y solo quieren hacerlo rápidamente. También puede crear una ofuscación personalizada eligiendo las transformaciones / técnicas que desee.


17
2018-06-08 20:35