基于Python AST實現(xiàn)代碼安全檢測功能
在某些場景下(在線代碼執(zhí)行平臺、腳本上傳平臺、自動任務系統(tǒng)等),我們必須限制用戶代碼中危險模塊(如 os、sys、socket)以及危險函數(shù)(如 eval、exec)的使用,否則會帶來安全風險。
本文介紹一種 基于 Python AST(抽象語法樹) 的代碼安全檢查方案,并給出完整示例代碼,適用于實際生產(chǎn)環(huán)境。
一、為什么使用 AST
常見的字符串匹配方式容易被繞過,例如:
e = ev
b = al
(e + b)("print(123)")
而 AST 解析后,所有語句都會被解析成結(jié)構(gòu)化節(jié)點,從根本上杜絕字符串拼接繞過的可能性。
二、完整檢測代碼
下面是完整的 AST 檢測類 CheckFun:
import ast
class CheckFun(ast.NodeVisitor):
def __init__(self):
super().__init__()
self.ban_moudel = [
"os",
"sys",
"socket",
"multiprocessing",
"requests",
]
self.ban_func = ["exec", "eval"]
self.allow = True
self.res = []
def visit_Import(self, node):
# 禁止導入模塊
for item in node.names:
if item.name in self.ban_moudel:
self.allow = False
self.res.append("不允許導入 %s 包" % item.name)
def visit_Assign(self, node):
# 禁止賦值后調(diào)用危險函數(shù),如 b = eval
try:
if node.value.id in self.ban_func:
self.allow = False
self.res.append("賦值右側(cè)不允許出現(xiàn) %s" % node.value.id)
except:
pass
def visit_Call(self, node):
# 禁止直接調(diào)用 eval、exec
try:
if isinstance(node.func, ast.Name):
if node.func.id in self.ban_func:
self.allow = False
self.res.append("不允許調(diào)用 %s" % node.func.id)
except:
pass
def visit_ImportFrom(self, node):
# 禁止 from xxx import xx
if node.module in self.ban_moudel:
self.allow = False
self.res.append("不允許導入 %s 包" % node.module)
def test_function(fn_str):
root_node = ast.parse(fn_str)
ckf = CheckFun()
ckf.visit(root_node)
if ckf.allow:
print("allow")
else:
print("unallow")
for item in ckf.res:
print(item)
三、測試示例
示例一:包含危險模塊和危險函數(shù)的代碼
func2 = """
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
b=eval
b(123)
eval(321)
def aaaaaa(text):
import sx
import sys
print(1)
return re.search(r"\d+", text).group(0)
"""
檢測執(zhí)行:
test_function(func2)
輸出示例:
e = ev
b = al
(e + b)("print(123)")
四、從文件讀取并檢測
如果需要從外部文件讀取用戶代碼并檢測,可以這樣寫:
with open('./tmp/' + args[1], 'r') as f:
root_node = ast.parse(f.read())
ckf = CheckFun()
ckf.visit(root_node)
if ckf.allow:
print("allow")
else:
print("unallow")
五、實際應用場景
該方式非常適合:
- 在線代碼執(zhí)行平臺
- WebIDE / 教程平臺
- 自動 Python 任務系統(tǒng)
- 安全沙箱
- 禁止用戶訪問系統(tǒng)資源的場景
因為 AST 是結(jié)構(gòu)化的,無法通過字符串拼接繞過,是目前最可靠的靜態(tài)檢測方式之一。
到此這篇關于基于Python AST實現(xiàn)代碼安全檢測功能的文章就介紹到這了,更多相關Python代碼檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python自動調(diào)整PPT文本框內(nèi)容防止溢出的代碼實現(xiàn)
在自動化處理PPT時,文本框內(nèi)容溢出是一個常見問題,本文將分享一個Python腳本,通過計算文本框容量自動截斷文本并添加省略號,確保內(nèi)容適配文本框尺寸,代碼基于python-pptx庫,適用于批量處理PPT模板,需要的朋友可以參考下2025-04-04
Python的type()函數(shù)用法小結(jié)(最新推薦)
在本文中,深入探討了type()函數(shù)的用法,提供了詳細的示例代碼,并討論了其在Python編程中的實際應用,通過學習如何正確使用type()函數(shù),可以更好地掌握Python編程,并寫出更可靠的代碼,需要的朋友可以參考下2024-07-07

