Как я могу защитить свой сценарий lua от сброса глобальной таблицы? - PullRequest
0 голосов
/ 14 июля 2020

Как я могу защитить свой lua скрипт от сброса глобальной таблицы ?

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

1. Выполнение функции с глобальной таблицей, которая является подмножеством реальной глобальной таблицы

Для этого вы можете использовать функцию setfenv (подробнее здесь )

Пример (Lua <5.2): </p>

function someMaliciousFunction()
    -- do stuff
end

someMaliciousFunction = setfenv(someMaliciousFunction, {
    -- cherry-pick whatever this function should be able to do
    ["print"] = _G.print
})

-- the function will see the table above as its _G table
someMaliciousFunction()

Пример (Lua> = 5.2):

function someMaliciousFunction()
    -- do stuff
end

local temp = _ENV
_ENV = {
    -- cherry-pick whatever this function should be able to do
    ["print"] = _G.print
}

-- the function will see the table above as its global table
someMaliciousFunction()

_ENV = temp

2. Временная перезапись глобальной таблицы

Вы также можете перезаписать глобальную таблицу. Это предотвратит перебор всех элементов с использованием pairs или ipairs, но сохранит квалифицированный доступ ко всем глобальным переменным. Пример:

local temp = _G
_G = setmetatable({}, {__index = temp, __newindex = temp})

someMaliciousFunction()

_G = temp
0 голосов
/ 14 июля 2020

Если вы используете Lua 5.2 или выше, функция pairs проверит метаметод __pairs. Если он существует, он вызовет его для генерации данных перечисления для вызова pairs. Таким образом, вы можете запретить кому-либо выполнять итерацию по глобальной таблице, присвоив этой таблице метаметод __pairs, который либо возвращает «пустой» итератор (return function() return nil end, nil, nil), либо просто завершается ошибкой с error.

Однако, Функция Lua next (которая является не частью библиотеки debug) не заботится о метаметоде __pairs. Он обеспечивает итерацию по всей таблице.

Таким образом, вам также нужно будет либо удалить next из того, что скрипт может получить доступ, либо обернуть next функцией, которая, если таблица имеет метаметод __pairs , вернет nil или error out.

Pre- Lua 5.2, вам нужно будет написать свою собственную версию pairsnext), которая эффективно выполняет эти действия (что есть, проверьте наличие метаметода __pairs и действуйте соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...