最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python AST實現(xiàn)代碼安全檢測功能

 更新時間:2025年12月03日 09:05:34   作者:weixin_46244623  
在某些場景下,我們必須限制用戶代碼中危險模塊,所以本文將和大家介紹一下基于 Python AST的代碼安全檢查方案,并給出完整示例代碼,有需要的可以了解下

在某些場景下(在線代碼執(zhí)行平臺、腳本上傳平臺、自動任務系統(tǒng)等),我們必須限制用戶代碼中危險模塊(如 ossys、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)

    Python自動調(diào)整PPT文本框內(nèi)容防止溢出的代碼實現(xiàn)

    在自動化處理PPT時,文本框內(nèi)容溢出是一個常見問題,本文將分享一個Python腳本,通過計算文本框容量自動截斷文本并添加省略號,確保內(nèi)容適配文本框尺寸,代碼基于python-pptx庫,適用于批量處理PPT模板,需要的朋友可以參考下
    2025-04-04
  • 2019 Python最新面試題及答案16道題

    2019 Python最新面試題及答案16道題

    這篇文章主要介紹了2019 Python最新面試題及答案16道題 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • 實例講解Python中浮點型的基本內(nèi)容

    實例講解Python中浮點型的基本內(nèi)容

    在本文里小編給大家整理了關于Python中浮點型的基本知識點內(nèi)容,有興趣的朋友們學習下。
    2019-02-02
  • Python實現(xiàn)EM算法實例代碼

    Python實現(xiàn)EM算法實例代碼

    這篇文章主要給大家介紹了關于Python實現(xiàn)EM算法的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Sanic框架Cookies操作示例

    Sanic框架Cookies操作示例

    這篇文章主要介紹了Sanic框架Cookies操作,結(jié)合實例形式分析了Sanic框架cookie讀取、寫入及刪除等簡單操作技巧,需要的朋友可以參考下
    2018-07-07
  • python pandas分組聚合詳細

    python pandas分組聚合詳細

    分組聚合是數(shù)據(jù)處理中常見的場景,在pandas中用groupby方法實現(xiàn)分組操作,用agg方法實現(xiàn)聚合操作,在這篇文章里有主要介紹,感興趣的朋友請參考下文
    2021-09-09
  • 詳解python 破解網(wǎng)站反爬蟲的兩種簡單方法

    詳解python 破解網(wǎng)站反爬蟲的兩種簡單方法

    這篇文章主要介紹了詳解python 破解網(wǎng)站反爬蟲的兩種簡單方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • 淺談pytorch中的dropout的概率p

    淺談pytorch中的dropout的概率p

    這篇文章主要介紹了淺談pytorch中的dropout的概率p,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Python對列表中的各項進行關聯(lián)詳解

    Python對列表中的各項進行關聯(lián)詳解

    這篇文章主要給大家介紹了關于Python對列表中各項進行關聯(lián)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。
    2017-08-08
  • Python的type()函數(shù)用法小結(jié)(最新推薦)

    Python的type()函數(shù)用法小結(jié)(最新推薦)

    在本文中,深入探討了type()函數(shù)的用法,提供了詳細的示例代碼,并討論了其在Python編程中的實際應用,通過學習如何正確使用type()函數(shù),可以更好地掌握Python編程,并寫出更可靠的代碼,需要的朋友可以參考下
    2024-07-07

最新評論

浦东新区| 英德市| 盈江县| 禄丰县| 汉阴县| 梅州市| 湖北省| 衡阳市| 内黄县| 开原市| 奉化市| 鄂伦春自治旗| 都安| 万宁市| 张家界市| 普洱| 同江市| 仁布县| 西和县| 成安县| 枞阳县| 梁河县| 岐山县| 马公市| 望都县| 兴和县| 凤凰县| 湖州市| 南木林县| 新田县| 陆河县| 屏东县| 钟祥市| 富民县| 民丰县| 张家港市| 泽库县| 内丘县| 顺昌县| 无棣县| 西昌市|