网站首页 > 技术文章 正文
摘要:缓存控制着我周围的所有事物。pyc文件包含机密信息,因此不应该包含在源代码控制系统中。可以使用Python标准的.gitignore文件,移除源代码控制系统对pyc文件的包含。
当你第一次导入Python文件时,Python解释器将编译该文件并将产生的字节码缓存到.pyc文件中,这样以后导入时就避免了再解析或编译代码产生新的开销。
对于Python项目来说,将配置、密钥和密码(统称为“机密”)存储在名为secret.py,config.py或者settings.py之类的gitignored Python文件中也是一种常见的实践,这些机密信息在项目的其他部分导入使用。这在机密信息和源代码之间提供了一个很好的分离,在大多数情况下,这种设置工作得很好。而且由于它复用了语言的导入机制,这些项目不必在文件I/O或JSON之类的格式上浪费时间。
但是在这种模式快速且方便的同时,它也可能是不安全的。因为它重用了语言的导入机制(该机制有创建和缓存.pyc文件的习惯),所以这些机密也存在于编译的字节码中!使用GitHub API进行的一些初步研究显示,数千个GitHub代码仓库的字节码中隐藏着机密。
用于在代码仓库中查找机密的现有工具(我最喜欢的是trufflehog)跳过了像.pyc这样的二进制文件,而是只扫描纯文本文件,如源代码或配置文件。
缓存来源的速成课程
Python的早期版本将这些文件存储在原始源文件旁边,但是从Python 3.2开始,这些文件都位于导入模块根目录的一个名为__pycache__的文件夹中。
假设我们有一个包含下面密码的Python文件:
这行代码的字节码是这样的:
注意,变量名和字符串是完全复制的!而且,Python字节码通常包含足够的信息来恢复代码的原始结构。像uncompyle6这样的工具可以将.pyc文件转换回它们的原始形式。
缓存泄漏机密
为了调查这个问题到底有多普遍,我编写了一个简短的脚本来搜索GitHub上的.pyc文件并对其进行反编译以寻找秘密。最后我找到了数千个Twitter密钥、条带标记、AWS证书和社交媒体密码。我通知了被我用这种方式破解密钥的相关机构。
你自己试试吧!
这篇文章附带了一个小的夺旗风格的实验,你可以自己尝试这种风格的攻击。
代码地址:
https://github.com/veggiedefender/pyc-secret-lab/
额外说明
缓存的字节码是一种底层的内部性能优化,Python的这种优化为我们带来了方便!如果没有像反汇编或反编译这样的特殊工具,.pyc文件的内容是难以理解的。当这些文件被隐藏在__pycache__(双下划线代表仅供内部使用)中时,它们很容易被忽视。许多文本编辑器和IDE将这些文件夹和文件从源代码目录树中隐藏起来,以避免弄乱屏幕,从而很容易忘记它们的存在。
也就是说,对于一个有经验的程序员来说,无意中泄漏他们的机密是很容易的,而且初学者更容易犯这样的错误。要避免这种情况,要么需要有足够的gitignore知识,要么需要对git和Python内部有一定的了解。
你可以做的事情:
在你的代码仓库中查找松散的.pyc文件,并删除它们
如果你有.pyc文件并且它们包含机密,那么可以撤销和轮换你的机密
使用标准的gitignore来防止检入.pyc文件
使用JSON文件或环境变量进行配置
英文原文:https://blog.jse.li/posts/pyc/
译者:穆胜亮
猜你喜欢
- 2025-04-05 靠着这套python基础天花板,我一跃进入心心念念的字节,年薪50W
- 2025-04-05 字节开源MoE关键优化技术,主流大模型均能接入,训练成本可省40%!
- 2025-04-05 dill,一个高效的 Python 库!(disp python)
- 2025-04-05 Python内置模块及说明(python 内置模块)
- 2025-04-05 字节跳动团队斥巨资打造了最新的python,附入门Python的背记手册
- 2025-04-05 字节开源MoE关键优化技术,训练成本再砍40%!内部万卡集群已部署
- 2025-04-05 你敢相信,字节跳动开发了(Python项目开发实战)
- 2025-04-05 Java程序员,一周Python入门:数据类型、变量、字符串和字符编码
- 2025-04-05 字节跳动把Python入门知识点整理成手册了,高清PDF开放下载
- 2025-04-05 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
- 264℃Python短文,Python中的嵌套条件语句(六)
- 263℃python笔记:for循环嵌套。end=""的作用,图形打印
- 261℃PythonNet:实现Python与.Net代码相互调用!
- 256℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 256℃Python实现字符串小写转大写并写入文件
- 116℃原来2025是完美的平方年,一起探索六种平方的算吧
- 96℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 89℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- 金母鸡量化教学场:pandas—数据挖掘的Python库
- 分享一个用于商业决策数据挖掘的python案例
- Python图像识别实战(二):批量图像读取和像素转换(附源码)
- 从小白到大神,这10个超实用的 Python 编程技巧不可少
- 太震撼!527页战略级Python机器学习实战,实用度碾压群书!附PDF
- 一篇文章带你解析Python进程(一篇文章带你解析python进程怎么写)
- 大数据分析师如何进行数据挖掘?大数据分析师丨 2025 年报考攻略
- UG编程第34节:浅谈机床坐标系(ug编程机床坐标系细节)
- 想入门Python?先狠下心来死磕这7个方向
- Python大屏看板最全教程之Pyecharts图表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)