2012-03-12 56 views
6

我已经多次说过,没有办法限制Lua脚本的内存使用,包括人们跳过箍环来防止Lua脚本创建函数和表。但考虑到lua_newstate允许你传递一个自定义分配器,难道不能用它来限制内存消耗吗?在最坏的情况下,人们可以使用基于竞技场的分配器,并且对硬盘分区可以使用的内存量进行限制。限制Lua脚本的内存使用情况?

我在这里错过了什么吗?

+1

“我多次看过它说”两个字:需要引用。 – 2012-03-12 17:40:46

+0

沙盒上的Lua wiki页面提到将内存用作可能的攻击,但没有提及限制它的方式:http://lua-users.org/wiki/SandBoxes。我想我误解了这个页面,它谈论的是“Looah”而不是Lua:http://www.sk89q.com/2010/03/sandboxed-lua-via-php/ – 2012-03-17 15:46:27

+1

“他们总是试图阻止创建函数或表。“那是因为他们不希望他们创建表和函数。他们想要保持全球范围。与防止内存被使用相比,这是一个不同的任务。 – 2012-03-17 18:06:39

回答

9
static void *l_alloc_restricted (void *ud, void *ptr, size_t osize, size_t nsize) 
{ 
    const int MAX_SIZE = 1024; /* set limit here */ 
    int *used = (int *)ud; 

    if(ptr == NULL) { 
    /* 
     * <http://www.lua.org/manual/5.2/manual.html#lua_Alloc>: 
     * When ptr is NULL, osize encodes the kind of object that Lua is 
     * allocating. 
     * 
     * Since we don’t care about that, just mark it as 0. 
     */ 
    osize = 0; 
    } 

    if (nsize == 0) 
    { 
    free(ptr); 
    *used -= osize; /* substract old size from used memory */ 
    return NULL; 
    } 
    else 
    { 
    if (*used + (nsize - osize) > MAX_SIZE) /* too much memory in use */ 
     return NULL; 
    ptr = realloc(ptr, nsize); 
    if (ptr) /* reallocation successful? */ 
     *used += (nsize - osize); 
    return ptr; 
    } 
} 

为了使Lua的使用分配,则可以使用

int *ud = malloc(sizeof(int)); *ud = 0; 
lua_State *L = lua_State *lua_newstate (l_alloc_restricted, ud); 

注:我没有测试过的来源,但它应该工作。

+0

谢谢,虽然我想知道为什么我从来没有见过任何人使用这种技术;他们总是试图阻止创建函数或表。 – 2012-03-17 15:29:14

+0

现在我又看了一遍,看起来原因是人们正在尝试从Lua内部的沙箱代码。 – 2012-03-17 15:48:45

+1

我觉得int malloc真的想在使用之前归零 – 2013-01-15 12:33:50