讲师中心 微信公众号
AI工具推荐 视频效率加速

Python ast 模块的代码审查工具

大辰姑娘_6293

大辰姑娘_6293

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

|

1062人浏览过

|

来源于php中文网

原创

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

python ast 模块的代码审查工具

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

直接 eval() 或 exec() 用户输入是高危操作,ast.parse() 是唯一安全的替代入口。它不执行,只生成语法树,但默认仍会解析所有合法 Python 语法——包括 ast.Import、ast.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.Import、ast.ImportFrom、ast.Call、ast.Attribute、ast.Subscript、ast.Name(当 ctx 是 ast.Load 且名字在危险列表中)
  • 危险标识符列表至少包含:__import__、eval、exec、compile、open、os、sys、subprocess、builtins
  • 对 ast.Attribute 要递归检查链式访问:a.b.c 需确认 a 是否为危险名,不能只看 c

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

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

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载

性能影响:深度递归遍历大型 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论文写作工具,复旦大学NLP团队推出的AI学术智能体。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

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

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

3320

2023.09.27

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

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

269

2026.02.03

string转int
string转int

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

7219

2023.08.02

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

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

6304

2023.10.24

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

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

3384

2024.02.23

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

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

1892

2025.10.17

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

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

17180

2023.12.04

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

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

1223

2024.02.23

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn