1

javascript がブラウザーで実行されている場合、関数コードはダウンロードされてソースで表示されるため、関数コードを非表示にする必要はありません。

サーバー上で実行すると、状況が変わります。実行されるコードをユーザーに表示させずに呼び出す関数をユーザーに提供したい api などのユースケースがあります。

特定のケースでは、ノード内でユーザーが送信した JavaScript を実行したいと考えています。node.js api をサンドボックス化することはできますが、ユーザーが関数を toString して実行されるコードを表示することなく、このサンドボックスに独自の api を追加したいと考えています。

ユーザーが関数コードを出力できないようにするパターンや方法を知っている人はいますか?

アップデート:

これは、以下の受け入れられた回答に基づく完全な解決策です(私は信じています)。これはクライアント側のコードを使用して示されていますが、注意してください。ダウンロードしたコードを読むだけで隠し関数の内容を誰かが見ることができるため、このクライアント側は使用しませ(ただし、縮小化を使用した場合は、コードを検査するために基本的な速度が低下する可能性があります)。

これは、ユーザーがサンドボックス環境内で API コードを実行できるようにするが、API の動作を表示できないようにするサーバー側での使用を目的としています。このコードのサンドボックスは、要点を示すためだけのものです。これは実際のサンドボックスの実装ではありません。

// function which hides another function by returning an anonymous
// function which calls  the hidden function (ie. places the hidden
// function in a closure to enable access when the wraped function is passed to the sandbox) 
function wrapFunc(funcToHide) {
  var shownFunc = function() {
    funcToHide();
  };
  return shownFunc;
}

// function whose contents you want to hide
function secretFunc() {
  alert('hello');            
}

// api object (will be passed to the sandbox to enable access to
// the hidden function)
var apiFunc = wrapFunc(secretFunc);
var api = {};
api.apiFunc = apiFunc;

// sandbox (not an actual sandbox implementation - just for demo)
(function(api) {
  console.log(api);
  alert(api.apiFunc.toString());
  api.apiFunc();
})(api);
4

1 に答える 1

5

関数でコールバックをラップすると、実際にはコールバック スコープから隠されている別の関数をそのスコープで使用できます。

function hideCall(funcToHide) {
    var hiddenFunc = funcToHide;
    var shownFunc = function() {
        hiddenFunc();
    };
    return shownFunc;
}

次に、このように実行します

var shtumCallBack = hideCall(secretSquirrelFunc);
userCode.tryUnwindingThis(shtumCallBack);

userCode スコープはsecretSquirrelFunc、それを呼び出す以外にアクセスできません。これが必要とするスコープは、hideCall使用できない関数のスコープであるためです。

于 2012-10-09T12:33:19.537 に答える