メインコンテンツまでスキップ

スクリプトを保護し、require を正しく扱う


require がセキュリティリスクになる可能性があるのはなぜですか?

  • XXTouch で暗号化されたスクリプトモジュールは、ほかのスクリプトまたはモジュールから require で参照できます
  • 暗号化されたスクリプトが require されるとき、グローバル環境は信頼できません。スクリプトが呼び出す関数が置き換えられている可能性があります

require を正しく使用するには?

  • XXTouch は、require される前に、一部のモジュールの関数が初期状態へ復元されることを保証します。対象には osiostringdevicehttpfiletable モジュールのすべての関数が含まれます
  • グローバル環境をモジュール内のローカル環境へディープコピーすることで、上記モジュールの関数を安全に呼び出せます。例:
    -- このコードをスクリプトの先頭に追加します
    local _ENV = table.deep_copy(_ENV)
    -- 以下がスクリプト本体です
    --
    -- 最後に、エクスポートする関数または定数を返す必要がある場合があります
  • モジュールが require で参照されると、グローバル変数 been_require は無条件に true に設定されます。この変数を使うと、現在のスクリプトが require されているかどうかを判定できます。例:
    -- このコードをスクリプトの先頭に追加します
    if been_require then
    return -- require されている場合はただちに終了します
    end
    -- 以下がスクリプト本体です