Prevent Lua infinite loop

前端 未结 5 1826
暖寄归人
暖寄归人 2020-12-19 02:24

I use lua interfaces to get lua support in my C# program, the worker thread will freeze if the user submits code like this

while true do end
<
5条回答
  •  既然无缘
    2020-12-19 02:37

    Sandboxing Lua

    Setting hooks is not sufficient at all to prevent unintended waste of resources, let alone abuse- here's a simple example (the time is spent during string pattern matching- no debug hooks get called):

    s=('a'):rep(20000):match('.-b')

    The only reliable way to force time/memory constraints on a piece of Lua code is to run the Lua interpreter in a process of its own and to make your OS monitor that process.

    The nice thing with Lua is that you won't need any complicated, OS-dependent permission setup for sandboxing: you just limit time and memory (reasonable; on windows there are Job Objects, Unix has ulimits- relevant: Linux resource limitation) and then keep things like os.execute, half the io-library and modules like luasocket away from the scripter (pretty easy).

    Recovering from errors in sandboxed code

    You can handle almost everything (except violation of time/memory limits) without trashing your Lua interpreter: Just wrap the execution of user-supplied code inside a pcall; if you call any Lua-API functions that might fail yourself, you need to wrap them inside a function that you can pcall, too (or set a Lua panic function and handle it from there).


    [I didn't want people glancing at this thread to assume that debug.sethook is adequate for sandboxing, and stackoverflow would not let me comment (yet)]

提交回复
热议问题