0

0

Python ast 模块的代码审查工具

舞夢輝影

舞夢輝影

发布时间:2026-02-15 15:39:10

|

962人浏览过

|

来源于php中文网

原创

ast.parse() 是安全解析未信任代码的唯一入口,仅生成ast不执行;需配合自定义nodevisitor拦截import、call、attribute等危险节点,并严格检查上下文(如load/store)和链式访问,禁用compile()/exec(),不可依赖literal_eval()。

python ast 模块的代码审查工具

怎么用 ast.parse() 安全地解析未信任代码

直接 eval()exec() 用户输入是高危操作,ast.parse() 是唯一安全的替代入口。它不执行,只生成语法树,但默认仍会解析所有合法 Python 语法——包括 ast.Importast.Call 等可能触发副作用的节点(比如 __import__('os').system('rm -rf /') 在 parse 阶段不会执行,但后续遍历时若不加限制,就可能被误放行)。

实操建议:

  • 始终传入 mode='exec'(默认值),避免因 mode='eval' 导致解析多语句时报 SyntaxError: invalid syntax
  • 捕获 SyntaxError 并返回具体错误位置:except SyntaxError as e: print(f"Line {e.lineno}, col {e.offset}: {e.msg}")
  • 不要对原始 AST 节点调用 compile()exec() —— 这等于绕过审查,前功尽弃

如何识别并拦截危险 AST 节点类型

静态审查的核心不是“允许什么”,而是“禁止什么”。Python AST 中真正需要拦截的节点极少,但漏掉任意一个都可能导致 RCE 或信息泄露。

常见错误现象:只检查 ast.Call,却忽略 ast.Attribute(如 os.system 的左值)或 ast.Subscript(如 __builtins__['open']);或者用字符串匹配函数名,结果被 getattr(__import__('os'), 'system') 绕过。

立即学习Python免费学习笔记(深入)”;

实操建议:

  • 必须拦截的节点类型:ast.Importast.ImportFromast.Callast.Attributeast.Subscriptast.Name(当 ctxast.Load 且名字在危险列表中)
  • 危险标识符列表至少包含:__import__evalexeccompileopenossyssubprocessbuiltins
  • ast.Attribute 要递归检查链式访问:a.b.c 需确认 a 是否为危险名,不能只看 c

ast.NodeVisitor 遍历时容易忽略的上下文陷阱

很多工具ast.NodeVisitor 实现白名单逻辑,但没意识到节点的 ctx 属性(如 ast.Load / ast.Store)和父节点类型共同决定语义。比如 os = 1 中的 osast.Store,不该报错;但 os.system() 中的 osast.Load,必须拦截。

去日租网站系统
去日租网站系统

去日租程序是一款具有强大的功能的基于.NET+SQL2000+AJAX构架的房屋出租管理系统。 日租网站管理系统,采用ASP.NET2.0语言开发,它集成租房模块、文章模块、订单模块、邮箱短信模块、用户模板、SEO优化模块、房间模块、支付模块等多项强大功能。系统有多年经验的高级工程师采用三层架构开发,页面代码全部采用DIV+CSS,完全符合SEO标准,有利于搜索引擎关键排名优化。日租网站

下载

性能影响:深度递归遍历大型 AST 可能触发 Python 默认递归限制(RecursionError),尤其嵌套字典/列表推导式较多时。

实操建议:

  • 重写 visit_Name(self, node) 时,先判断 isinstance(node.ctx, ast.Load) 再查黑名单
  • sys.setrecursionlimit(3000) 临时放宽限制(仅限审查阶段,非生产执行)
  • 避免在 visit_* 方法中做耗时操作(如正则匹配、网络请求),审查应纯内存计算

为什么不能依赖 ast.literal_eval() 做通用审查

ast.literal_eval() 确实安全,但它只支持极小的子集:数字、字符串、元组、列表、字典、布尔值、None。一旦用户输入含函数调用、变量引用、运算符(如 1 + 1)、甚至注释,就会抛出 ValueError: malformed node or string —— 这不是审查失败,是能力缺失。

使用场景错配典型表现:把配置文件校验当成代码审查,或误以为 “只允许字面量” 就等于 “足够安全”。

实操建议:

  • 如果业务只要求解析静态数据,用 ast.literal_eval() 没问题;但凡涉及变量、调用、导入,就必须切回 ast.parse() + 自定义遍历
  • 不要试图给 ast.literal_eval() 打补丁(比如预处理替换变量名)—— 语义已丢失,补丁越写越不可靠
  • 注意它不支持 f-string、海象运算符(:=)、类型注解等 Python 3.6+ 特性,版本兼容性需手动对齐

真正难的不是写遍历逻辑,是厘清「哪些节点组合起来才构成可执行风险」。比如单独一个 ast.Name(id='os') 不危险,但它是 ast.Attribute(value=..., attr='system')value 时,整条链就该熔断。这种上下文敏感性,没法靠单节点匹配解决。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

11

2026.02.03

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

730

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1552

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

236

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

301

2024.02.23

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号