0

Luaでテーブルを読み取り専用にするにはどうすればよいですか? (具体的には、C# 用の Lua 5.1 を使用した LuaInterface ですが、それによって何も変わるとは思いません) __indexand__newindexの使用方法は知っていますが、誰かが実行することを妨げるものではありません: math = nil。これにより、さらにスクリプトが誤って実行される可能性があります。

私の現在の「保護」機能:

function protect(table) 
return setmetatable({}, { __index = table, 
__newindex = function(table, key, value) error("attempted to modify a read only table")         
end, __metatable = false }) end

math = protect(math)
math.sqrt = nil // successfully protected
math = nil // this is bad and can happen!
4

1 に答える 1

5

グローバル環境は単なるテーブルです。Lua 5.1 では、すべての関数 (コンパイルされた Lua スクリプトとは) に独自の環境があり、変更することができます。スクリプトをサンドボックス化してグローバル テーブルを変更できないようにする場合は、スクリプトの環境をサンドボックス化されたものに置き換えることで実行できます。

基本的に、アクセスできるようにしたいものを入れる読み取り専用テーブルを作成します。既存の要素を上書きしないようにメタテーブルを設定することもできますが、現在存在しないエントリを変更できます (つまり、独自のグローバルを作成して使用できます)。

そうは言っても、ユーザーがrawget/rawsetを実行できないようにしない限り、ユーザーはいつでもサンドボックスに侵入して、これらのテーブルを壊し始めることができます。

より安全なバージョンは、関数をコピーして各スクリプトの環境を構築することです。すべてのスクリプトが同じmathテーブルを取得するのではなく、スクリプトが触れられない場所であなたが追い払ったオリジナルのコピーを取得します。

于 2012-11-21T04:52:20.707 に答える