Что такое лучший javascript обфускатор? [закрытый]

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

7 ответов


Yahoo имеет довольно хороший. Технически это минификатор, но он делает хорошую работу по запутыванию в этом процессе.

Юи компрессора


протестировано 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;
}

Ну, google поднял это как первую ссылку:

http://www.javascriptobfuscator.com

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


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

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

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


вы также можете попробовать На JavaScript Компрессор написанная Дином Эдвардсом.


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

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