执行用户代码在线编译或者函数调用,必须要考虑到安全性的问题,因为用户的脚本嵌在后台服务中运行,用户的权限和服务的权限是一致的,如何做到安全或者说尽量降低用户的破坏带来的风险

文件安全的问题

是否可以使用python虚拟环境的方式,这样隔离相互不影响,但是这样一来用户调用执行的所需要的时间肯定大大增加

那是否可以限定用户的权限
需要提供给代码和用户一个可执行及创建删除等等权限的目录空间,但是在其他目录空间下仅有读的权限

因为接口平台的服务部署在鲸云中,仅有一个用户,无法通过用户的方式限定权限?
后面发现可以在构建的时候使用root权限

#解压包文件
RUN  tar -zxf colab.tar.gz
RUN pip install -r requirements.txt
RUN chmod -R 777 /app
USER cloud
#指定启动命令
CMD ["python3.7","run.py"]

构建成功后,再在鲸云中部署即可限制服务仅在/app 目录下有读取、写入、执行权限
搞定目录权限的问题!

代码的问题

因为代码直接在/app目录下解压后运行,在线编译的话用户可以直接读取所有的代码,所以打算做最初级的处理,即将运行后的服务代码删除,用户每次编译执行后的代码也进行删除

网上有某些为了对代码进行保密,运行规定的次数如1次后自动销毁的栗子

有两种方式,可以在执行程序开始,随着代码载入内存开始,对该代码文件实行文件销毁,或者对代码文件里内容进行销毁

print "code start"
 
def self_delete(max_times):
    import os
    file_name = os.path.split(__file__)[1]
    times = 0
    try:
        with open('times', 'r') as fp:
            times = int(fp.readlines()[0])
    except:
        pass
    if times < max_times-1:
        times += 1
        try:
            with open('times', 'w') as fp:
                fp.writelines(str(times))
        except:
            pass
    else:
        try:
            os.remove('times')
        except:
            pass
        print "delete codes!!!"
        ## delete file!!!
        # os.remove(file_name)
        ## delete codes!!!
        with open(file_name, 'r') as fp:
            codes = fp.readlines()
        with open(file_name, 'w') as fp:
            fp.writelines(codes[:1]+codes[-1:])
self_delete(1) # set your codes running times
#TODO
'''
add your codes here
'''
print 'add your codes here'
import time
for i in range(10):
    print 'hello world'
    time.sleep(i)
 
print "code end"

目前接口平台需要的是将所有的文件均删除,可否在服务运行后,某个接口第一次请求前即把所有代码进行删除呢?

这里使用到flaskbefore_first_request方法

@app.before_first_request
def before_first_request():
    # 初始化时操作,仅第一次请求时操作
    try:
        """删除所有的代码文件"""
        del_list = os.listdir(TEMP_FILE)
        for f in del_list:
            file_path = os.path.join(TEMP_FILE, f)
            if os.path.isfile(file_path):
                os.remove(file_path)
            elif os.path.isdir(file_path):
                shutil.rmtree(file_path, True)
    except Exception as e:
        traceback.print_exc(e)

不过这里遇到了一些坑。发现删除不了/app下面的目录,仅能删除第一级的文件而不能删除文件夹及文件夹的里面的文件,直接进入服务删除时提示无权限
当时构建时设置的权限语句是 RUN chmod +t /app ,将/app目录下所有文件及文件夹所有用户的权限均设置为7,即RUN chmod -R 777 /app 即可