安全性 – 如何在Lua中包装IO函数以防止用户离开X目录

你如何在Lua中包装IO函数以防止有人离开你的顶级目录.

您将它们放在“MyDoc”中,并且它们可以完全访问MyDoc的所有子内容,但不能将它们放回到C盘或其他任何地方.

最佳答案 打开liolib.c.转到这3个功能

static void opencheck (lua_State *L, const char *fname, const char *mode) {
  LStream *p = newfile(L);
  p->f = fopen(fname, mode);
  if (p->f == NULL)
    luaL_error(L, "cannot open file " LUA_QS " (%s)", fname, strerror(errno));
}

static int io_open (lua_State *L) {
  const char *filename = luaL_checkstring(L, 1);
  const char *mode = luaL_optstring(L, 2, "r");
  LStream *p = newfile(L);
  const char *md = mode;  /* to traverse/check mode */
  luaL_argcheck(L, lua_checkmode(md), 2, "invalid mode");
  p->f = fopen(filename, mode);
  return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
}


static int io_popen (lua_State *L) {
  const char *filename = luaL_checkstring(L, 1);
  const char *mode = luaL_optstring(L, 2, "r");
  LStream *p = newprefile(L);
  p->f = lua_popen(L, filename, mode);
  p->closef = &io_pclose;
  return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
}

这些是您要编辑的功能.

第一个接收文件名作为参数fname,第二个和第三个
将其作为本地变量filename从lua堆栈中弹出.

现在你需要做的就是

1)获得自己的流程路径

2)封装给定的文件路径

3)比较它们,使它们在两者上的最后一个斜线上相同

4)如果它们不相同则在opencheck中使用luaL_error(L,“拒绝访问%s”,fname);
   在另外两个返回luaL_fileresult(L,0,filename);

点赞