试试 python-dotenv,避免敏感信息被硬编码到代码中
我们开发的每个系统都离不开配置信息,例如数据库密码、Redis密码、邮件配置、各种第三方配置信息,这些信息都非常敏感,一旦泄露出去后果非常严重,被泄露的原因一般是程序员将配置信息和代码混在一起导致的。
判断一个系统是否正确地将配置排除在代码之外,一个简单的方法是看该系统的代码是否可以立刻开源,而不用担心会暴露任何敏感信息。
所以我们做的第一件事情就是将配置信息与代码解耦,根据不同的部署环境(开发环境、测试环境、预发布、生产环境)各使用一套配置文件,然后将配置信息集中到配置文件中。
例如在 django 最佳实践里面,就有这种做法,每个部署环境都有一个独立的配置文件,因为每个部署环境所需要的配置各不相同。
```python
├── settings
│ ├── __init__.py
│ ├── base.py
│ ├── local.py
│ ├── production.py
│ └── test.py
```
系统启动的时候,根据指定的环境变量决定加载哪个配置文件。
```python
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.local")
```
这样就完了吗?
不,因为配置信息还是和项目代码捆绑在一起,如果配置文件与代码同步到版本控制系统又担心敏感信息泄露。
前面只是将配置与代码解耦,但是代码与敏感配置信息并没有完全隔离。
一个更好的办法就是将配置存储于环境变量中,环境变量可以非常方便地在不同的部署间做修改,却不动一行代码,而这些信息同步到代码库的概率微乎其微。
在代码中我们通过读取环境变量中的配置信息来获取该值。
```python
settings.py
MAIL_SERVER = os.getenv('MAIL_SERVER')
MAIL_USERNAME = os.getenv('MAIL_USERNAME')
MAIL_PASSWORD = os.getenv('MAIL_PASSWORD')
```
现在哪怕代码开源出去,也没人知道密码是什么。
将配置信息保存在变量环境中,有好几种方式,一种就是手动在命令行挨个设置到环境变量中,类似于:
```python
EXPORT SECRET_KEY=xxxxx
EXPORT SQLALCHEMY_DATABASE_URI=XXXX
EXPORT ACCESSKEYID=XXXXX
```
这种方式很麻烦,每次启动都需要设,虽然你也可以写到类似 .bashrc 这样的文件中。
第二种方式是把配置信息写在supervisor中,如果你的系统是用supervisor来管理进程的话,supervisor 中可以设置环境变量,如:
```python
[program:xxxx]
environment=
KEY=value,
Key2=value2,
key3="val.&"
```
但是这种方式与 supervisor 的本身配置耦合在一起,用起来比较混乱。
而今天推荐的这个工具 `python-dotenv` 就可以完全独立于其它配置,只针对应用本身使用的配置信息,你只需要把配置信息全部写入到项目根目录的 `.env` 文件中
例如这样:
```
REDIS_ADDRESS=localhost:6379
MEANING_OF_LIFE=42
MULTILINE_VAR="hello\nworld"
```
这个文件我们不放在git版本控制系统中。然后用一行代码来加载配置信息到环境变量中
```python
# settings.py
from dotenv import load_dotenv
load_dotenv()
```
加载完成后就可以通过 `os.getenv` 方法去获取所有的配置信息。
```python
# settings.py
import os
SECRET_KEY = os.getenv("EMAIL")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")
```
这样就完全将敏感信息脱离于代码,同时代码与配置也进行了解耦。 python-dov 的安装用普通的pip安装即可
```python
pip install -U python-dotenv
```
这种使用方式在 django、flask 应用开发中很常见,而且他们基于此库也做了自己的扩展,例如 flask 中可以用 `.flaskenv` 来代替 `.env` 文件。
无
试试 python-dotenv,避免敏感信息被硬编码到代码中的更多相关文章
- 关于对MyBatis.net框架的学习笔记( MyBatis.net是一款灵活性极大,sql由开发者自行在xml中编写, 轻量的ORM映射框架). 同时避免了sql硬编码到代码中不易维护的问题...
对于为什么要用ORM,为什么又要选择MyBatis.net,这个问题希望读者自行查找资料.这里直接贴出相关的调试笔记. 步骤1)下载与引用. http://code.google.com/p/myba ...
- Android安全开发之浅谈密钥硬编码
Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...
- 保护 .NET Core 项目的敏感信息
我们的项目中几乎都会有配置文件,里面可能会存储一些敏感信息,比如数据库连接字符串.第三方 API 的 AppKey 和 SecretKey 等. 对于开源项目,这些敏感信息肯定不能随着源代码一起提交到 ...
- spring cloud实战与思考(五) JWT之携带敏感信息
需求: 需要将一些敏感信息保存在JWT中,以便提高业务处理效率. 众所周知JWT协议RFC7519使用Base64Url对Header和Payload的Json字符串进行编解码.A JWT is re ...
- 逆向路由器固件之敏感信息泄露 Part2
之前的文章中详细介绍了各种解包路由器固件的工具.解包之后就获得了固件中的文件.下一步就是分析文件寻找漏洞了.这次分析的目标是Trendnet路由器,分析的漏洞是一个远程获取路由器权限的漏洞. 初步分析 ...
- 在VS代码中编辑Python
在VS代码中编辑Python Python扩展提供了许多用于在Visual Studio代码中编辑Python源代码的功能: 自动完成和智能感知 在终端中运行选择/行(REPL) 格式化 重构 也见L ...
- iOS视频硬编码技术
iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...
- 【Android】Android Camera实时数据采集及通过MediaCodec硬编码编码数据的流程
吐槽: 其实常用流程都差不多,但是有时候还是会忘记某一步的详细用法,但是各位朋友请注意,官方已经不推荐Camera类的使用(现在是android.hardware.camera2),但无奈公司项目之前 ...
- 怎么在执行Python脚本时,密码等敏感信息也不让它出现
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...
随机推荐
- 精美的在线icon
super-tiny-icons(0.2.1)列表 序号 名称 图标 地址 是否使用 1 acast.svg https://cdn.jsdelivr.net/npm/super-tiny-icons ...
- golang开发:类库篇(四)配置文件解析器goconfig的使用
为什么要使用goconfig解析配置文件 目前各语言框架对配置文件书写基本都差不多,基本都是首先配置一些基础变量,基本变量里面有环境的配置,然后通过环境变量去获取该环境下的变量.例如,生产环境跟测试环 ...
- MVC+EFCore 完整教程18 -- 升级分布视图至 View Component
之前我们详细介绍过分布视图(partial view),在有一些更加复杂的场景下,.net core为我们提供了更加强大的组件 view component, 可以认为view component是 ...
- HTML --- <a href=”#”>与 <a href=”javascript:void(0)” 的区别
<a href=”#”>中的“#”其实是锚点的意思,默认为#top,所以当页面比较长的时候,使用这种方式会让页面刷新到页首(页面的最上部) javascript:void(0)其实是一个死 ...
- 【转】8年!我在OpenStack路上走过的坑。。。
8年!我在OpenStack路上走过的坑... 摘要: 2010年10月,OpenStack发布了第一个版本:上个月,发布了它的第18个版本Rocky.几年前气氛火爆,如今却冷冷清清.Rocky版本宣 ...
- Java常用命令及参数
Java的基本指令参数 javac [-d 目录|-verbose] file java [-classpath(cp) dir] file jar -zcvf dir file javap [-pr ...
- IrisSkin2.dll 添加皮肤
使用说明:把控件拖到你的form上,只需一行代码,即可实现整个form包括其所有控件的皮肤的更换,总共有几十套皮肤供使用,非常方便.省去你设计开发软件皮肤系统的时间和精力.全部源代码就一行: skin ...
- NLP(十二)依存句法分析的可视化及图分析
依存句法分析的效果虽然没有像分词.NER的效果来的好,但也有其使用价值,在日常的工作中,我们免不了要和其打交道.笔者这几天一直在想如何分析依存句法分析的结果,一个重要的方面便是其可视化和它的图分析 ...
- Linux学习笔记03
一.Linux常见命令 file:查看文件类型(windows用扩展名识别文件类型) 语法:file [options] [args] -b:显示结果时,不显示文件名 -c:显示执行file命令的执行 ...
- “$Bitmap 有标记已使用的未用簇”
前几天在电脑上用 DiskGenius 给移动硬盘分区的时候出现了这个错误,如下图所示: 解决方法: 在 cmd 命令行窗口中输入如下代码: chkdsk /f /x c: PS: 其中 " ...