您可能不知道敏感信息硬编码在程序中会带来多大的麻烦。
我曾经写过一个用 Python 发送 html 电子邮件和附件程序在互联网上共享。里面的收件人没有隐藏,而是使用了我最常用的电子邮件。然后,痛苦随之而来:我将继续收到测试电子邮件(垃圾邮件)。当我问其中一个发件人时,我知道培训机构使用这种教学,学生们什么都不改变,直接运行,所以我一直收到电子邮件。
与泄露密码相比,这个麻烦仍然很小。有些人不小心将包含用户名密码的程序上传到开源网站。
为了解决这个问题,有必要解耦敏感信息和程序代码。敏感信息放在一个文件中,程序代码放在另一个文件中,以避免在发布程序时上传敏感信息。一般来说,有两种方法:
1、配置文件。
可使用标准库 configparser[1] 分析配置文件。优点是不仅可以读取配置文件,还可以更新配置文件。
比如有这样的 example.ini 配置文件:
然后就可以这样读了:
你还可以使用一个 python 文件作为文件的配置,最优雅的方是模仿 Django,搞个默认 settings.py, ,用户自定义settings.py 用户自定义配置可以覆盖默认配置。这种方法很简单,没有记忆负担,就像写 Python 代码相同。
2、环境变量。
环境变量(environment variables)是指在操作系统中用来指定操作系统运行环境的一些参数,比如说安装 Python 是否需要 Python 可执行程序添加到 Path 中,这个 Path 是环境变量。
在 Linux 或 Mac 可以这样打印环境变量:
还可以在操作系统的环境变量中写下敏感信息,然后使用 Python 读取它:
但是这样做有缺点,你需要先 export key = value 先设置环境变量,或者需要先去 .bashrc、.zshrc 等配置文件添加您需要的环境变量,如果名称相同,可能会影响其他程序使用的同名环境变量。
毕竟,优雅的方式是在项目录中新建一个 .env 环境变量配置文件,如 .env 文件:
然后借助三方库 dotenv:
然后可以这样读:
而且这种方法不会影响任何其他程序。还有一点需要注意的是 .env 添加到你的 .gitignore。
假如你想对 .env 文件命名也可以,比如 dev.env,然后可以这样写:
甚至多个 env 文件也可以:
请参考更多用法python-dotenv[2]
最后
本文介绍了两种避免硬编码敏感信息的方法:配置文件和环境变量。发布程序时注意保护敏感信息,添加 .gitignore,如有帮助,请喜欢,看,关注支持。