web-dev-qa-db-ja.com

LuaJitFFIと非表示のC実装の詳細

LuaJitFFIを使用してアプリケーションを拡張したいと思います。見てきた http://luajit.org/ext_ffi_tutorial.html これをLua C APIと比較すると、これは驚くほど簡単です。ここまでは順調ですね。ただし、C関数を明確にラップしたくはありませんが、アプリケーションのスクリプトを作成するユーザーに高レベルのAPIを提供します。特に、ユーザーが「プリミティブ」、つまりffi.*名前空間にアクセスできるようにしたくありません。これは可能ですか、それともそのffi名前空間をユーザーのLuaスクリプトで使用できますか?

Sandboxing Luaの問題について、私は http://lua-users.org/wiki/SandBoxes を見つけましたが、これはFFIについては話していません。

さらに、私が上で説明した計画は、抽象化レイヤーの導入がコードのlua側で行われることを前提としています。これは推奨されるアプローチですか、それとも静的にコンパイルされたコード(C側)の機能を抽象化しますか?

3
wirrbel

「そのffi名前空間をユーザーのLuaスクリプトで使用できるか」と尋ねるとき、プログラミングが簡単なため、間違いを犯しにくくするため、または意図的な悪意のある攻撃から保護するために気にしますか?

最後の(セキュリティ)場合は、はい、サンドボックスについて確認する必要があります。合理的なものを作るのは難しいことではありませんが、本当にタイトなものはトリッキーです。

他の人(使いやすく、壊れにくい)の場合は、エクスポートされたモジュールに、他の人に使用してもらいたい高レベルの関数のみが含まれていることを確認してください。最も簡単な方法は、内部関数をローカル変数で作成し、モジュールになるテーブルに「エクスポートされた」関数のみを配置することです。 (ヒント:module()関数を使用しないでください)

2
Javier