Lua Sandboxing - исключение создания функций

Я читал в Lua wiki / здесь / и т. Д. О том, как изолировать код lua в целом. Но мне не удалось найти что-то, что запрещает создание функций. Например, пример здесь предоставляет пример кода как:

assert(run [[function f(x) return x^2 end; t={2}; t[1]=f(t[1])]])

И это с пустой средой. Но я хочу исключить возможность создания функции (1-я часть кода) - например, просто разрешить выражения. Есть идеи, как это сделать? Это должно быть как-то на C? Заранее спасибо!


person ktr    schedule 23.02.2011    source источник
comment
Если это возможно (я сомневаюсь в этом): пожалуйста, не делайте этого. Не говоря уже о том, что вы удалите важную часть языка (не библиотеки, языка - как если бы встроенное устройство не поддерживало указатели в их странном ответвлении C!), Что также означает, что вы серьезно повредите универсальности и выразительности любых скриптов, написанных во встроенном Lua.   -  person    schedule 24.02.2011
comment
если вы запрещаете функции, вы запрещаете лямбды. если вы запрещаете лямбды, вы запрещаете целый класс простых выражений.   -  person Chris Becke    schedule 25.02.2011


Ответы (2)


Если вы хотите оценивать только выражения, вы можете попробовать следующее:

function run(s) return loadstring("return "..s)() end

(обработка ошибок опущена)

Это простое решение предотвратит большинство "атак", но не устранит их, потому что можно сказать

(function () f=function(x) print"hello" end end)()

который определяет новую функцию с именем f.

Лучше всего использовать песочницу и не беспокоиться о том, что пользователь делает со средой, потому что это не будет вашей средой.

person lhf    schedule 23.02.2011
comment
Спасибо! Это сработало отлично ... Я недавно купил PIL и увидел этот метод, когда читал, но забыл о нем. Цените идеи / предложения. - person ktr; 25.02.2011

Вы можете попробовать обнаружить создание функций, выполнив поиск строки «function» перед тем, как разрешить выполнение lua-скрипта. Например, из вашего бэкэнда C / C ++.

Если появляется «функция», выдайте ошибку «вам не разрешено создавать функции» и не выполняйте код.

Пара заметок:

  • Возможно, вы захотите немного настроить обнаружение - например, выдавать ошибки только в том случае, если вы обнаруживаете функцию, за которой следуют пробелы и открывающая скобка. Я оставляю это как упражнение.
  • Вы должны знать, что есть некоторые стандартные функции lua, которые вроде как ожидают, что пользователи смогут создавать функции - например, в таблице string их несколько. Без создания функций вашим пользователям будет очень сложно работать со строками (с функциями уже уже достаточно сложно ...)
person kikito    schedule 24.02.2011
comment
В World of Warcraft используется аналогичный подход. У него есть обычная песочница Lua, которая просто предотвращает доступ к чему-либо вне программы. У него также есть вторая песочница с жесткими ограничениями, созданная внутри первой, использующая только Lua и разрешающая доступ только к предопределенному набору функций и возможностей. Он делает это с помощью loadstring() и сначала проверяет, содержит ли строка function, { или }, чтобы предотвратить создание функций и таблиц. - person Arrowmaster; 24.02.2011