6

LuaInterface 2.0.3を使用して、C#アプリにLuaスクリプト機能を埋め込もうとしています。これは今のところ問題なく機能していますが、指定された少数の.Netクラスのみにアクセスを制限する方法がわかりません。デフォルトでは、すべての.Netライブラリは「luanet」を介して直接アクセスでき、Luaスクリプトは自由に新しいウィンドウを開いたりファイルシステムにアクセスしたりできます。

たとえば、このLuaスクリプトは新しいウィンドウを開きます。

   Form = luanet.System.Windows.Forms.Form
   mainForm = Form()
   mainForm:ShowDialog()

スクリプトの自由は素晴らしいですが、これはホスティングアプリに干渉する可能性があり、私があまり好きではないセキュリティ関連の影響があります。これを無効にする方法はありますか?

4

2 に答える 2

9
--make a table for all the classes you want to expose
safeClasses = {}
--store all the ones you want
safeClasses.Form = luanet.System.Windows.Forms.Form
--etc...

--remove access to LuaInterface
luanet = nil
package.loaded.luanet = nil
--prevent future packages from being loaded
require = nil
package.loadlib = nil

これを逆に行うこともできます。最初にLuaInterfaceのグローバルインスタンスと保存されたインスタンスを削除してから、ローカル参照(ブロックの残りのすべてのコードで使用できます)を介してすべての作業を実行します。

--get a local reference to LuaInterface without clobbering the name
local luainterface = luanet

--delete the global reference to it
luanet = nil

--also delete it from the package store and disable package loading
package.loaded.luanet = nil
require = nil
package.loadlib = nil

--put luanet back locally at its original name (for convenience)
local luanet = luainterface 

--make a table for all the classes you want to expose
safeClasses = {}
--store all the ones you want
safeClasses.Form = luanet.System.Windows.Forms.Form
--etc...

(上記の()の3段階の名前保存ダンスを回避するには、グローバルテーブルにlocal luainterface=luanet; luanet=nil; local luanet=luainterface直接ローカライズしてから、グローバルテーブルへの参照luanetを通じてグローバルを削除します。_G

local luanet=_G.luanet
_G.luanet = nil

私は個人的な好みの問題としてそうしないことを選んだだけです。)

于 2011-05-30T01:57:11.020 に答える
0

正確にどの程度実行するかはわかりませんが、最初のステップは、追加のAppDomainでホストすることです。その追加のアプリドメインを使用すると、使用できるモジュールと使用できないモジュールをきめ細かく制御できますが、メインプログラムとスクリプトの間でデータを移動するための追加の作業が追加されます。

AssemblyLoad/イベントが最初のAssemblyResolve目的地になります。

于 2011-05-30T00:47:42.497 に答える