2009-02-06 18 views
16

Estoy buscando utilizar un ocultador de JavaScript. ¿Cuáles son algunos de los más populares y qué impacto tienen en el rendimiento?¿Cuál es el mejor ocultador de JavaScript?

+1

Aunque las cuestiones planteadas por Robert Harvey pueden ser más o menos cierto, las respuestas aquí proporcionan una lista de ofuscadores y es muy útil. Además, el Sr. Harvey insinúa que este sitio experto solo puede responder a preguntas simplistas y a la "opinión" experta y la discusión extendida es de alguna manera negativa. ¿La pregunta sería aceptable si fuera "¿Puedo obtener una lista de obsfuscadores?" Saludos, Dave H. – DHorse

+0

** DUPLICADO DE ** - >>> ** http: //stackoverflow.com/questions/194397/how-can-i-obfuscateprotect-javascript** –

+0

puede usar http: // jsobfuscator .byethost7.com/ –

Respuesta

12

Yahoo tiene uno muy bueno. Es técnicamente un minificador, pero hace un buen trabajo de ofuscación en el proceso.

YUI Compressor

+0

Comprimido y ofuscado a través del compresor YUI en línea gratis aquí: http://refresh-sf.com/yui/ – NexusRex

+0

el enlace ya no funciona –

3

Bueno, Google sacaste a este como el primer eslabón:

http://www.javascriptobfuscator.com

pero me pregunto lo que hace buena la ofuscación de Javascript. Sea lo que sea lo que está haciendo en javascript que necesita ofuscación probablemente debería hacerse en el servidor de todos modos, ¿verdad?

+0

De todo lo que he visto, este es quizás el mejor ofuscador. Aunque no he probado JScrambler. – AStackOverflowUser

2

nunca he utilizado Ofuscador en la producción, pero yo he probado JavaScript Utility y parece bastante bueno.

En cuanto al rendimiento, el código ofuscado se debe desempacar sobre la marcha cada vez que se carga la página. Puede que no sea un problema para las secuencias de comandos pequeñas, pero el tiempo de desembalaje será significativo con archivos más grandes. Por otro lado, el código minificado es ejecutable directamente por el navegador.

Algunos ofuscadores pueden producir resultados que no se ejecutan en navegadores más antiguos o menos comunes. Debe probar muy cuidadosamente con los navegadores que planea apoyar.

+1

Los ofuscadores no requieren ningún desempaquetado de códigos. Otros esquemas para minimizar el código pueden requerir eso, pero obfsucation por sí mismo no lo hace. –

+0

Estoy de acuerdo en que tengo confusiones y empaques mezclados aquí. El empaquetado es un enfoque común para ofuscar JS, pero su objetivo principal es disminuir el tamaño del archivo de script. –

6

Probado 8 ofuscadores diferentes (excepto www.javascriptobfuscator.com), y fue sorprendido por lo mucho que todos chupan. Terminé escribiendo mi propio ofuscador usando expresiones regulares. Disfrutar de:

static Dictionary<string, string> names = new Dictionary<string, string>(); 
static bool testing = false; 
static string[] files1 = 
    @"a.js,b.js,c.js" 
    .Split(new string[] { Environment.NewLine, " ", "\t", "," }, StringSplitOptions.RemoveEmptyEntries); 
static string[] ignore_names = 
    @"sin,cos,order,min,max,join,round,pow,abs,PI,floor,random,index,http, 
    __defineGetter__,__defineSetter__,indexOf,isPrototypeOf,length,clone,toString,split,clear,erase 
    RECT,SIZE,Vect,VectInt,vectint,vect,int,double,canvasElement,text1,text2,text3,textSizeTester,target,Number 
    number,TimeStep,images,solid,white,default,cursive,fantasy,". 
    Split(new string[] { Environment.NewLine, " ", "\t", "," }, StringSplitOptions.RemoveEmptyEntries); 
string[] extra_names = @"a,b,c".Split(new string[] { Environment.NewLine, " ", "\t", "," }, StringSplitOptions.RemoveEmptyEntries); 
string src = @"C:\temp"; 
string dest1 = src + "\\all1.js"; 
string dest2 = src + "\\all2.js"; 

static void Main() 
{ 
    File.Delete(dest1); 
    File.Delete(dest2); 
    foreach (string s in files1) 
    File.AppendAllText(dest1, File.ReadAllText(src + "\\" + s) + Environment.NewLine + Environment.NewLine + Environment.NewLine + Environment.NewLine + Environment.NewLine + Environment.NewLine, Encoding.UTF8); 

    string all = File.ReadAllText(dest1); 
    int free_index = 0; 

    foreach (string s in extra_names) 
    { 
    free_index++; 
    string free_name = "" + (char)('A' + (free_index % 25)) + (char)('A' + ((free_index/25) % 25)); 
    Debug.Assert(free_name != "AA"); 
    names.Add(s, free_name); 
    } 

    Regex reg1 = new Regex("(var |function |\\.prototype\\.)([a-zA-Z0-9_]+)"); 

    int startat = 0; 
    while (startat < all.Length) 
    { 
    Match match = reg1.Match(all, startat); 
    if (!match.Success) 
     break; 

    string key = all.Substring(match.Groups[2].Index, match.Groups[2].Length); 
    if (!ignore_names.Contains(key)) 
    { 
     free_index++; 
     string free_name = "" + (char)('A' + (free_index % 25)) + (char)('A' + ((free_index/25) % 25)); 
     Debug.Assert(free_name != "AA"); 
     if (!names.ContainsKey(key)) 
     names.Add(key, testing ? key + free_name : free_name); 
    } 
    startat = match.Groups[0].Index + match.Groups[0].Length; 
    } 

    Regex reg2 = new Regex(@"/\*.*\*/", RegexOptions.Multiline); 
    Regex reg3 = new Regex("([^:\\\\])//.*\r\n"); 
    Regex reg4 = new Regex("([a-zA-Z0-9_]+)"); 
    Regex reg5 = new Regex("(\r\n)*[ \t]+"); 
    Regex reg6 = new Regex("(\r\n)+"); 
    all = reg2.Replace(all, eval2); 
    all = reg3.Replace(all, eval3); 
    all = reg4.Replace(all, eval4); 
    all = reg5.Replace(all, eval5); 
    all = reg6.Replace(all, eval6); 
    File.WriteAllText(dest2, all); 
} 

public static string eval4(Match match) 
{ 
    return names.ContainsKey(match.Groups[1].Value) ? names[match.Groups[1].Value] : match.Groups[0].Value; 
} 
public static string eval5(Match match) 
{ 
    return string.IsNullOrEmpty(match.Groups[1].Value) ? " " : Environment.NewLine; 
} 
public static string eval6(Match match) 
{ 
    return Environment.NewLine; 
} 
public static string eval2(Match match) 
{ 
    return " "; 
} 
public static string eval3(Match match) 
{ 
    return match.Groups[1].Value + Environment.NewLine; 
} 
+12

¿Por qué "todos chupan"? ¿Qué problema resuelve tu código? – frenchie

+2

@frenchie Bueno, para empezar, pegue javascript ofuscado generado con esos ofuscadores "sucky" en el embellecedor de JavaScript en http://jsbeautifier.org/ y mire cómo no se ofusca al instante. – trusktr

+1

@ AareP, ¿puede proporcionar algunas transformaciones de muestra? – trusktr

Cuestiones relacionadas