例如,我有一个library,我想保护源代码不被查看。想到的第一个方法是为私有函数创建公共包装器,如下面的
function executeMyCoolFunction(param1, param2, param3) {
return executeMyCoolFunction_(param1, param2, param3);
}
只有公共部分代码才会以这种方式显示。没关系,但所有Google服务功能都像function abs() {/* */}
。我很好奇,是否有一种隐藏库源代码的方法呢?
编辑00:不要使用其他库“隐藏”库代码,即具有已知项目密钥的LibA使用具有未知项目密钥的LibB。 LibB的公共函数代码可以获取甚至执行它们。代码是
function exploreLib_(lib, libName) {
if (libName == null) {
for (var name in this) {
if (this[name] == lib) {
libName = name;
}
}
}
var res = [];
for (var entity in lib) {
var obj = lib[entity];
var code;
if (obj["toSource"] != null) {
code = obj.toSource();
}
else if (obj["toString"] != null) {
code = obj.toString();
}
else {
var nextLibCode = exploreLib_(obj, libName + "." + entity);
res = res.concat(nextLibCode);
}
if (code != null) {
res.push({ libraryName: libName, functionCode: code });
}
}
return res;
}
function explorerLibPublicFunctionsCode() {
var lstPublicFunctions = exploreLib_(LibA);
var password = LibA.LibB.getPassword();
}
答案 0 :(得分:0)
编辑:更改了我的答案,以反映异常的堆栈跟踪将包含库项目键的事实。
在此示例中,MyLibraryB是MyLibraryA包含的库。两者都公开共享以查看(访问控制),但只有MyLibraryA的项目密钥已知。看起来攻击者很难看到MyLibraryB中的代码:
//this function is in your MyLibraryA, and you share its project key
function executeMyCoolFunction(param1, param2, param3) {
for (var i = 0; i < 1000000; i++) {
debugger; //forces a breakpoint that the IDE cannot? step over
}
//... your code goes here
//don't share MyLibraryB project key
MyLibraryB.doSomething(args...);
}
但是根据@ megabyte1024的评论,如果你在MyLibraryB.doSomething()中引起异常,则堆栈跟踪将包含MyLibraryB的项目密钥。
答案 1 :(得分:0)
我不知道谷歌做了什么,但你可以做这样的事情(没有经过测试!只是一个想法):
函数声明:
var myApp = {
foo: function { /**/ },
bar: function { /**/ }
};
然后,在另一个地方,匿名函数写入foo()和bar():
(function(a) {
a['\u0066\u006F\u006F'] = function(){
// here code for foo
};
a['\u0062\u0061\u0072'] = function(){
// here code for bar
};
})(myApp);
您可以打包或缩小以进一步混淆。