我想设置一个服务器,学生可以上传和运行课程代码。但是,我不希望他们访问各种功能,例如system(),这可能会导致对我的服务器的错误访问。我可以在预处理器输出中搜索显式函数调用,但是如果用户创建了这样的函数指针:
int (*syst)(const char*) = system;
syst("rm *");
我仍然对威胁持开放态度。但是,我不能只搜索字符串" system",因为它是一个有效的名称 - 如果学生没有包含cstdlib,他们可以使用该名称作为变量名称。由于这是一个开始的编程课程,因此拥有一个十英里长的变量名称黑名单是一个坏主意。
有没有办法定义除名称以外的功能,并允许我在编译代码之前搜索其他名称?
答案 0 :(得分:3)
到目前为止,最简单的解决方案是编译代码 - 这非常无害 - 然后查看实际的库导入。用户可能已定义了自己的system
,但这不会导致从system
导入glibc
。
您无法查看原始源代码的主要原因是#define
允许恶意用户隐藏列入黑名单的符号名称。但是还有很多其他的可能性,包括
auto hidden = &sys\
tem;
所以你需要对源进行一些处理,而且只需要完全处理整个源代码就可能是最简单的。
答案 1 :(得分:1)
我还建议作为非特权用户在chroot
内运行。它比VM重量更轻。
唉,从指针中获取函数名是不可能的 How to get function's name from function's pointer in C?这个问题是从C的角度来看的,但基本上它也是同样的问题。