我已经多次说过,没有办法限制Lua脚本的内存使用,包括人们跳过箍环来防止Lua脚本创建函数和表。但考虑到lua_newstate允许你传递一个自定义分配器,难道不能用它来限制内存消耗吗?在最坏的情况下,人们可以使用基于竞技场的分配器,并且对硬盘分区可以使用的内存量进行限制。限制Lua脚本的内存使用情况?
我在这里错过了什么吗?
我已经多次说过,没有办法限制Lua脚本的内存使用,包括人们跳过箍环来防止Lua脚本创建函数和表。但考虑到lua_newstate允许你传递一个自定义分配器,难道不能用它来限制内存消耗吗?在最坏的情况下,人们可以使用基于竞技场的分配器,并且对硬盘分区可以使用的内存量进行限制。限制Lua脚本的内存使用情况?
我在这里错过了什么吗?
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);
注:我没有测试过的来源,但它应该工作。
谢谢,虽然我想知道为什么我从来没有见过任何人使用这种技术;他们总是试图阻止创建函数或表。 – 2012-03-17 15:29:14
现在我又看了一遍,看起来原因是人们正在尝试从Lua内部的沙箱代码。 – 2012-03-17 15:48:45
我觉得int malloc真的想在使用之前归零 – 2013-01-15 12:33:50
“我多次看过它说”两个字:需要引用。 – 2012-03-12 17:40:46
沙盒上的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
“他们总是试图阻止创建函数或表。“那是因为他们不希望他们创建表和函数。他们想要保持全球范围。与防止内存被使用相比,这是一个不同的任务。 – 2012-03-17 18:06:39