我正在寻找使用 javascript 混淆器。哪些是最受欢迎的,它们对性能有什么影响?
7 回答
雅虎有一个很好的。从技术上讲,它是一个缩小器,但它在过程中的混淆方面做得很好。
测试了 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;
}
好吧,谷歌把这个作为第一个链接:
http://www.javascriptobfuscator.com
但我想知道 javascript 的混淆有什么好处。无论您在需要混淆的 javascript 中做什么,都应该在服务器端完成,对吧?
我从未在生产中使用过混淆器,但我测试过JavaScript Utility,它看起来还不错。
至于性能,每次加载页面时都必须即时解压缩混淆代码。对于小脚本可能不是问题,但是对于较大的文件,解包时间会很重要。另一方面,浏览器可以直接执行压缩代码。
一些混淆器可能会产生无法在较旧或不太常见的浏览器中运行的输出。您应该使用您计划支持的浏览器进行非常仔细的测试。
你也可以试试Dean Edwards 写的JavaScript Compressor 。
我不得不说Hackvertor(否认是我写的)它是免费的,它支持基于标签的转换。查看示例:-
带base62的打包机
http://dean.edwards.name/packer/
https://github.com/jcoglan/packr <= ruby 版本