如何用Google方式隐藏库源代码?

时间:2012-08-11 13:30:15

标签: google-apps-script

例如,我有一个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();
}

2 个答案:

答案 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);

您可以打包或缩小以进一步混淆。