2009-02-06 2 views
16

Я ищу использовать обфускатор javascript. Каковы некоторые из самых популярных и какое влияние они оказывают на производительность?Какой лучший обфускатор javascript?

+1

Хотя вопросы, поднятые Роберт Харви может быть более или менее верно, ответы здесь предоставляют список обфускаторы и очень полезно. Кроме того, г-н Харви предполагает, что этот экспертный сайт может отвечать только на упрощенные вопросы, а экспертное «мнение» и расширенное обсуждение - это как-то негативно. Будет ли вопрос приемлемым, если бы это было: «Могу ли я получить список обфускаторов?» С уважением, Dave H. – DHorse

+0

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

+0

вы можете использовать http: // jsobfuscator .byethost7.com/ –

ответ

12

Yahoo имеет довольно хороший. Это технически мини-инструмент, но он неплохо работает в запутывании.

YUI Compressor

+0

Сжатый и обфузированный через компрессор YUI онлайн бесплатно: http://refresh-sf.com/yui/ – NexusRex

+0

ссылка больше не работает –

3

Ну, Google воспитан это как первое звено:

http://www.javascriptobfuscator.com

Но интересно то, что делает хорошее запутывание в JavaScript. Независимо от того, что вы делаете в javascript, который нуждается в обфускации, вероятно, должно быть сделано серверной стороной, так или иначе?

+0

Из всего, что я видел, это, пожалуй, лучший обфускатор. Хотя я не пробовал JScrambler. – AStackOverflowUser

2

Я никогда не использовал обфускатор в производстве, но я проверил JavaScript Utility и, кажется, довольно хорошо.

Что касается производительности, обфусканный код должен быть распакован на лету каждый раз, когда страница загружается. Возможно, это не проблема для небольших скриптов, но время распаковки будет значительным с большими файлами. С другой стороны, миниатюрный код напрямую выполняется браузером.

Некоторые обфускаторы могут выдавать выходные данные, которые не запускаются в старых или менее распространенных браузерах. Вы должны тщательно протестировать браузеры, которые вы планируете поддерживать.

+1

Обфускаторы не требуют распаковки кода. Другие схемы минимизации кода могут потребовать этого, но obfsucation сам по себе этого не делает. –

+0

Я согласен с тем, что я запутался и упаковался здесь. Упаковка - это общий подход к запутыванию JS, но его основная цель - уменьшить размер файла сценария. –

2

Я бы сказал, что Hackvertor (отказался от того, что я его написал) является бесплатным и поддерживает преобразование на основе тегов. Проверьте пример: -

http://www.businessinfo.co.uk/labs/hackvertor/hackvertor.php#PEBoYXNlZ2F3YV83KCKqwMHCw8TGyMnKy8zNzs%2FQ0dLT1NXW2Nna29zd3t%2Fg4eLj5OXm5%2Bjp6uvs7e7v8PHy8%2FT19vj5%2Bvv8%2Ff4kXyIpPmFsZXJ0KCJJJ2Qgc2F5IEhhY2t2ZXJ0b3IiKTxAL2hhc2VnYXdhXzc%2B

+1

Кто-нибудь знает, как это использовать?Кажется, я не понимаю. – Noitidart

6

Проверено 8 различных обфускаторов (кроме www.javascriptobfuscator.com), и был поражен тем, насколько все они сосут. Закончилось создание собственного обфускатора с использованием регулярных выражений. Наслаждайтесь:

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

Почему «все они сосут»? Какую проблему решает ваш код? – frenchie

+2

@frenchie Ну, для одного, вставьте обфускацию javascript, сгенерированную с помощью этих «sucky» obfuscators, в JavaScript-конструктор на http://jsbeautifier.org/ и наблюдайте, как он мгновенно запутывается. – trusktr

+1

@AareP, можете ли вы предоставить некоторые примеры преобразований? – trusktr