试试 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 ...
随机推荐
- 快速掌握mongoDB(三)——mongoDB的索引详解
1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...
- ItemsControl绑定的数据模板显示不同样式:模板选择器
总所周知,wpf提供了数据模板,列表控件可以绑定数据实现批量显示同类型数据.不过同个数据模板显示不同的样式怎么办?这时我们可以用模板选择器. 首先我们可以将数据绑定到首先定义资源样式 <Data ...
- 比赛:小奔的方案 solution
题目 题目背景 有一个著名的题目: 五个海盗抢到了100个金币,每一颗都一样的大小和价值连城. 他们决定这么分: 1.抽签决定自己的号码 ------ [1.2.3.4.5] 2.首先,由1号提出分配 ...
- [USACO07FEB]银牛派对Silver Cow Party
题目简叙: 寒假到了,N头牛都要去参加一场在编号为X(1≤X≤N)的牛的农场举行的派对(1≤N≤1000),农场之间有M(1≤M≤100000)条有向路,每条路长Ti(1≤Ti≤100). 每头牛参加 ...
- 小代学Spring Boot之自定义Starter
想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...
- 备战金九银十,Java研发面试题(Spring、MySQL、JVM、Mybatis、Redis、Tomcat)[带答案],刷起来!
八月在即,马上就是"金九银十",又是跳槽招聘季.咱们这行公认涨薪不如跳槽加的快.但不建议频繁跳槽,还是要学会融合团队,抓住每个机会提升技能. 苏先生在这里给大家整理了一套各大互联网 ...
- cookbook_模块和包
1把模块按层次结构组织成包 只需确保每个目录中都定义了__init__.py即可. 2对所有符号的导入进行精确控制 当用户使用from module import * 语句时,我们希望对从模块或包中导 ...
- 关于java飞机躲炮弹的一些对象说明(带源码)
1.飞机躲炮弹的各种实体类都需要一个画笔将他们画出来 (GameObject) import java.awt.*; public void drawSelf(Graphics g){ g.drawI ...
- CentOS 7.3下使用YUM 安装MySQL5.6
1.检查Linux系统中是否已安装 MySQL rpm -qa | grep mysql 返回空值的话,就说明没有安装 MySQL 注意:在新版本的CentOS7中,默认的数据库已更新为了Mariad ...
- Pandas随机采样
实现对DataFrame对象随机采样 pandas是基于numpy建立起来的,所以numpy大部分函数可作用于DataFrame和Series数据结构. numpy.random.permutatio ...