2

そのため、Lua のグローバルなデフォルト スタイルにイライラするようになりました。その後に実行されるすべてのプログラムがグローバル変数を作成できないようにするプログラムを作成しようとしています。彼らがしようとすると、その変数はそのプログラムの関数環境に設定されます。私はこれを思いつきました、そしてそれはうまくいくようですが、何らかの理由で ComputerCraft rom/programs/edit の [edit: 9] でエラーを投げています。テストプログラムを実行すると、

a = 1
print(a)

それは正常に機能し、そのプログラムによるアクセスを許可しながらグローバル変数が作成されるのを防ぎますが、他のプログラムでは機能しません。_G.a や local a などをやってみましたが、どれもうまくいきます。他のプログラムで動作しない理由を知っている人はいますか?

local oldload = loadfile
function _G.loadfile(str)
  local func = oldload(str)
  local env = {}
  env._G = env
  setmetatable(env, {__index = _G, __newindex = 
    function(table, var, val)
      rawset(env, var, val)
    end})
  setfenv(func, env)
  return func
end
4

2 に答える 2

1

Lua は組み込み言語として設計されています。これは、最終的な決定者がホスト言語の C であることを意味します。

1 つの Lua スクリプトは、サンドボックス化手法を介して別のスクリプトよりも優位に立つことができます。スクリプトを完全にサンドボックス化しませんでした。を変更loadfileしましたが、変更していないloadか、またはdofile.

しかし、それは問題ではありません。なんで?優位性という点では、C が常に勝つためです。loadfileC は Lua関数を呼び出しません。もちろん、それは可能ですが、通常はそうではありません。代わりに Lua API を呼び出しますluaL_loadfile

Lua コードは、直接ロードする他の Lua コードのサンドボックスを確立できます。ただし、C コードが意図的に Lua サンドボックス内に存在するように設計されていない限り、Lua ベースのサンドボックスは C コードには影響しません。ほとんどの C ライブラリはそうではありません。

これが意味することは、制御できない C 実行環境で実行することに決めたら、Lua サンドボックスは何の意味も持たないということです。C コードは、ユーザーの制御の及ばないスクリプトをロードして、必要な環境を与えることができます。多くの場合はそうなります。

そして、Lua からできることは何もありません。これを解決する唯一の方法は、Lua .dll 自体を変更してサンドボックスを確立することです。

于 2016-02-09T23:35:43.817 に答える