Lua Sandboxing - устранение создания функций - PullRequest
1 голос
/ 24 февраля 2011

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

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

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

Ответы [ 2 ]

6 голосов
/ 24 февраля 2011

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

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

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

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

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

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

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

1 голос
/ 24 февраля 2011

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

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

Пара замечаний:

  • Возможно, вы захотите попытаться настроить обнаружение немного больше - только выбросить ошибки, если вы обнаружите функцию, за которой следуют пробелы и открывающая скобка, например.Я оставляю это как упражнение.
  • Вы должны знать, что есть некоторые стандартные функции lua, которые вроде ожидают , что пользователи смогут создавать функции - например, string в таблице есть несколько таких.Без создания функций вашим пользователям будет очень трудно работать со строками (это уже достаточно сложно с функциями ...)
...