我们开发的每个系统都离不开配置信息,例如数据库密码、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,避免敏感信息被硬编码到代码中的更多相关文章

  1. 关于对MyBatis.net框架的学习笔记( MyBatis.net是一款灵活性极大,sql由开发者自行在xml中编写, 轻量的ORM映射框架). 同时避免了sql硬编码到代码中不易维护的问题...

    对于为什么要用ORM,为什么又要选择MyBatis.net,这个问题希望读者自行查找资料.这里直接贴出相关的调试笔记. 步骤1)下载与引用. http://code.google.com/p/myba ...

  2. Android安全开发之浅谈密钥硬编码

    Android安全开发之浅谈密钥硬编码 作者:伊樵.呆狐@阿里聚安全 1 简介 在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码.文件中,这样做会引起很大风 ...

  3. 保护 .NET Core 项目的敏感信息

    我们的项目中几乎都会有配置文件,里面可能会存储一些敏感信息,比如数据库连接字符串.第三方 API 的 AppKey 和 SecretKey 等. 对于开源项目,这些敏感信息肯定不能随着源代码一起提交到 ...

  4. spring cloud实战与思考(五) JWT之携带敏感信息

    需求: 需要将一些敏感信息保存在JWT中,以便提高业务处理效率. 众所周知JWT协议RFC7519使用Base64Url对Header和Payload的Json字符串进行编解码.A JWT is re ...

  5. 逆向路由器固件之敏感信息泄露 Part2

    之前的文章中详细介绍了各种解包路由器固件的工具.解包之后就获得了固件中的文件.下一步就是分析文件寻找漏洞了.这次分析的目标是Trendnet路由器,分析的漏洞是一个远程获取路由器权限的漏洞. 初步分析 ...

  6. 在VS代码中编辑Python

    在VS代码中编辑Python Python扩展提供了许多用于在Visual Studio代码中编辑Python源代码的功能: 自动完成和智能感知 在终端中运行选择/行(REPL) 格式化 重构 也见L ...

  7. iOS视频硬编码技术

    iOS视频硬编码技术 一.iOS视频采集硬编码 基本原理 硬编码 & 软编码 硬编码:通过系统自带的Camera录制视频,实际上调用的是底层的高清编码硬件模块,即显卡,不使用CPU,速度快 软 ...

  8. 【Android】Android Camera实时数据采集及通过MediaCodec硬编码编码数据的流程

    吐槽: 其实常用流程都差不多,但是有时候还是会忘记某一步的详细用法,但是各位朋友请注意,官方已经不推荐Camera类的使用(现在是android.hardware.camera2),但无奈公司项目之前 ...

  9. 怎么在执行Python脚本时,密码等敏感信息也不让它出现

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http ...

随机推荐

  1. Java编程思想:File类getCanonicalFile()方法,listFile()方法

    import java.io.IOException; import java.util.*; import java.util.regex.Pattern; import java.io.File; ...

  2. go 学习笔记之初识 go 语言

    Go 是一种开源编程语言,可以轻松构建简单,可靠,高效的软件. 摘录自 github: https://github.com/golang/go,其中官网(国外): https://golang.or ...

  3. 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3cp8ng15g94wc

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3cp8ng15g94wc

  4. C#2.0增功能04 可以为 null 的类型

    连载目录    [已更新最新开发文章,点击查看详细] 可以为 null 的类型是 System.Nullable<T> 结构的实例. 可以为 null 的类型可表示一个基础类型的所有值 T ...

  5. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

  6. springboot整合mybatis时无法读取xml文件解决方法(必读)

    转    http://baijiahao.baidu.com/s?id=1588136004120071836&wfr=spider&for=pc 在springboot整合myba ...

  7. 使用jquery删除链接所在的行

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 【iOS】获取应用程序本地路径

    Xcode 会为每一个应用程序生成一个私有目录,并随机生成一个数字和字母串作为目录名,在每一次应用程序启动时,这个字母数字串都是不同于上一次. 所以通常使用 Documents 目录进行数据持久化的保 ...

  9. .NET Core on K8S学习实践系列文章索引(Draft版)

    一.关于这个系列 自从去年(2018年)底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发 ...

  10. 安装使用xen虚拟化工具

    换了一家新公司,需要拿出一套虚拟化方案,就把业界的主流虚拟化技术划拉了一遍,给领导交了一份报告,具体的技术部分已经在之前的随笔里了,本篇文章主要介绍的是xen虚拟化工具的安装: Xen官方部署文档:h ...