私は現在、C++環境でV8を使っています。私は、サーバーのクライアントシステムを作って、JSをサーバーに送信してサーバー上で実行できるようにしています。それは期待どおりに動作しますが、私は砂場環境を作る方法を考え出すピクルを持っています。私は、クライアントコードから関数名をブラックリストに登録するのを避けようとしています。サンドボックスで使用するためのJSライブラリを書き込むために使用:V8クラスを公開していますが、特定のコードでは制限しています
JSライブラリファイル:
は私がつもり構造は、2つのファイルの種類があります。 V8にさらされているC++クラスにアクセスできます。このファイルで定義された関数は、クライアントからアクセス可能になります。
サンドボックス: JSライブラリファイルで定義されているが、V8に公開されたC++クラスにはアクセスできない関数にアクセスできるようになります。
これにより、システムの「管理者」は非常に強力な公開C++クラスを使用してJSライブラリファイルを書き込むことができますが、クライアントがlibファイルに定義されている関数や、
JSライブラリファイル(isInNationLib.js):
function isInAmerica(clientName) {
var ip = ipByClientName(clientName);
//use the ip to find if the client is in America
}
クライアントファイル:
#include "isInNationLib"
function getNationality(clientName) {
if (isInAmerica(clientName)) {
return "American";
}
etc...
}
から
ことがない完全にクリアされている場合は、ここでのシナリオの例であります上記の例では、クライアントはセキュリティ上の理由からipByClientNameにアクセスすることはできません。 ipByClientNameは、V8に公開されているC++関数です。この特定の例は私のプロジェクトには含まれませんが、問題のセキュリティ面を紹介しています。
ブラックリストに載せることで、違法な機能を表す実際の文字列をクライアントコードで検索し、拒否することを意味しますか?ええ、それは動作しません。 – Yakk
私は知っていますが、私はそれを行う他の方法を考えることはできません。 –
ホワイトリスト。許可されたコードの呼び出しを暗号の強い固有の名前に置き換えますか?敗北は、敵対的なコードがソースや他の人の呼び出しを取得したり、エントリーポイントや何かを列挙したりする必要があります。 – Yakk