試試 python-dotenv,避免敏感信息被硬編碼到代碼中

咱們開發的每一個系統都離不開配置信息,例如數據庫密碼、Redis密碼、郵件配置、各類第三方配置信息,這些信息都很是敏感,一旦泄露出去後果很是嚴重,被泄露的緣由通常是程序員將配置信息和代碼混在一塊兒致使的。python

判斷一個系統是否正確地將配置排除在代碼以外,一個簡單的方法是看該系統的代碼是否能夠馬上開源,而不用擔憂會暴露任何敏感信息。git

因此咱們作的第一件事情就是將配置信息與代碼解耦,根據不一樣的部署環境(開發環境、測試環境、預發佈、生產環境)各使用一套配置文件,而後將配置信息集中到配置文件中。程序員

例如在 django 最佳實踐裏面,就有這種作法,每一個部署環境都有一個獨立的配置文件,由於每一個部署環境所須要的配置各不相同。數據庫

├── settings
│   ├── __init__.py
│   ├── base.py
│   ├── local.py
│   ├── production.py
│   └── test.py
複製代碼

系統啓動的時候,根據指定的環境變量決定加載哪一個配置文件。django

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.local")複製代碼

這樣就完了嗎?flask

不,由於配置信息仍是和項目代碼捆綁在一塊兒,若是配置文件與代碼同步到版本控制系統又擔憂敏感信息泄露。bash

前面只是將配置與代碼解耦,可是代碼與敏感配置信息並無徹底隔離。工具

一個更好的辦法就是將配置存儲於環境變量中,環境變量能夠很是方便地在不一樣的部署間作修改,卻不動一行代碼,而這些信息同步到代碼庫的機率微乎其微。測試

在代碼中咱們經過讀取環境變量中的配置信息來獲取該值。spa

settings.py
MAIL_SERVER = os.getenv('MAIL_SERVER')
MAIL_USERNAME = os.getenv('MAIL_USERNAME')
MAIL_PASSWORD = os.getenv('MAIL_PASSWORD')複製代碼

如今哪怕代碼開源出去,也沒人知道密碼是什麼。

將配置信息保存在變量環境中,有好幾種方式,一種就是手動在命令行挨個設置到環境變量中,相似於:

EXPORT SECRET_KEY=xxxxx
EXPORT SQLALCHEMY_DATABASE_URI=XXXX
EXPORT ACCESSKEYID=XXXXX複製代碼

這種方式很麻煩,每次啓動都須要設,雖然你也能夠寫到相似 .bashrc 這樣的文件中。

第二種方式是把配置信息寫在supervisor中,若是你的系統是用supervisor來管理進程的話,supervisor 中能夠設置環境變量,如:

[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版本控制系統中。而後用一行代碼來加載配置信息到環境變量中

# settings.py
from dotenv import load_dotenv
load_dotenv()複製代碼

加載完成後就能夠經過 os.getenv 方法去獲取全部的配置信息。

# settings.py
import os
SECRET_KEY = os.getenv("EMAIL")
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")複製代碼

這樣就徹底將敏感信息脫離於代碼,同時代碼與配置也進行了解耦。 python-dov 的安裝用普通的pip安裝便可

pip install -U python-dotenv複製代碼

這種使用方式在 django、flask 應用開發中很常見,並且他們基於此庫也作了本身的擴展,例如 flask 中能夠用 .flaskenv 來代替 .env 文件。

相關文章
相關標籤/搜索