Если вы хотите оценивать только выражения, вы можете попробовать это:
function run(s) return loadstring("return "..s)() end
(обработка ошибок пропущена)
Это простое решение предотвратит большинство «атак», но не устранит ихпотому что можно сказать
(function () f=function(x) print"hello" end end)()
, который определяет новую функцию с именем f
.
Лучше всего использовать песочницу и не беспокоиться о том, что пользователь делает с окружающей средой, потому чтоэто не будет вашей средой.