2

たとえば、ライブラリがあり、ソース コードが表示されないように保護したいと考えています。頭に浮かぶ最初の方法は、次のようなプライベート関数のパブリック ラッパーを作成することです。

function executeMyCoolFunction(param1, param2, param3) {
  return executeMyCoolFunction_(param1, param2, param3);
}

この方法では、コードの公開部分のみが表示されます。問題ありませんが、すべての Google サービス関数は のように見えますfunction abs() {/* */}。Google のようにライブラリのソース コードを非表示にする方法はありますか?

編集 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();
}
4

2 に答える 2

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 へのプロジェクト キーが含まれます。

于 2012-08-11T22:40:48.667 に答える
0

Google が何をしているのかわかりませんが、次のようなことができます (テストされていません! ただのアイデアです):

関数宣言:

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

さらに難読化するために、パックまたは縮小することができます。

于 2012-08-11T23:33:34.370 に答える