为什么环境变量 Matters Environment Every app都有秘密:API密钥,数据库URL,管理员密码.
在源代码中硬编码它们是一种单向出泄的门票.
即使你的回购是私人的,你永远不知道 谁叉它或CI日志曝光。
环境变量是使配置远离代码的标准方式.
但安全地使用它们需要一些 超越仅仅是的习惯。 (原始内容存档于2017-03-27).
The Basics: loading and Accessing in Node.js, you read env vars with.
但你不应该到处接触他们 创建一个中央配置模块来验证和曝光它们.
启动时失败 。
如果缺少一个必要的变量,则立即崩溃,而不是以混乱的方式在以后失败.
从不提交.env文件 dotenv 从文件中加载变量等工具用于本地开发.
该文件必须远离版本控制.
立即加进你 如果使用的话,请添加等。
与其承诺实际值,不如使用占位符或假值。
这文件记录了需要什么而不暴露任何东西。
使用验证库手册的检查对于小项目是罚款的,但是对于任何认真使用像或......一样的策略验证器的事务是罚款的。
他们给你输入强迫,默认, 和清除错误消息。
这捕捉缺失的Vars, 错误的类型, 并允许明智的默认 而不分散的呼叫。
从不记录机密 在调试时登入阴道非常容易, 做一个不完全伐木的习惯。
如果您必须登录配置, 请编辑敏感字段 。
同时注意错误消息.
一些库在所抛出的错误中包含连接字符串.
把它包起来脱去 每个环境使用不同的值 不要在 dev 和 prod 中重复使用相同的 API 密钥 。
被泄露的 dev 键可能不太重要,但它仍然是一个立足点。
每个环境分开的密钥,可以更容易地旋转或撤销一个而不影响其他密钥.
使用命名公约:,或者更好,使用单独的文件和每个环境的CI秘密.
大多数平台(Heroku,Vercel,AWS)都有内置的秘密管理.
用它来代替 运输env vars的代码。
避免默认是真实的秘密 常见的反模式 设置默认像...
那个缺省 是一个真正的秘密 坐在你的源。
使用空字符串或占位符,如果使用则明显失败。
如果您需要本地 dev 的默认值, 请使用一个明显不真实的假值, 并确保您代码在尝试使用时会响亮失败 。
旋转和限制 将秘密视为易腐烂。
如果你怀疑有漏出,请旋转钥匙.
尽可能使用短寿命证书.
许多云提供商通过IAM角色或服务账户提供临时代币.
把钥匙放在长寿钥匙上 也限制权限 。
您的应用程序使用的 API 密钥只应该有所需的最小范围 。
如果泄露,爆炸半径会更小.
工具和做法摘要 使用中央配置模块,而不是在任何地方生化.
启动时验证所需的 vars 。
别乱动,只用承诺 使用验证库进行类型安全和默认.
校正日志和错误中的秘密。
每个环境都有单独的秘密 没有真正的秘密作为默认。
旋转密钥并使用最小权限 。
这些习惯需要一点纪律,但可以让你免于尴尬和昂贵的泄密.
从配置模块和规则开始;其他的可以随您项目的增长而遵循.