.env 非常方便,几乎所有现代框架都会用它。但只要存放位置弄错一处,就等于把网站的一整串钥匙贴在大门上。本文从零开始讲解它的含义和防护方法。
再讲细一点
应用里有「随环境而变的值」和「不想给人看到的值」。比如数据库密码、外部服务的 API key、用来加密会话的密钥等。如果把这些直接写死在源代码里,一旦共享代码,秘密也会跟着一起泄露。
于是,把这些集中到 .env 这一个文件里,代码则以「环境变量」的形式读取它们。Next.js、Laravel、Rails 等许多框架都采用这种方式。
为什么是「最危险的文件」
.env 在一个文件里汇集了多把钥匙,所以这里一旦泄露,损害就会一下子扩散开来。把每把钥匙「泄露后会发生什么」并列出来,就能看出有多严重。
| 泄露的值 | 会发生什么 |
|---|---|
| 数据库认证信息 | 数据被读取、篡改、全部删除 |
| 外部 API key | 被冒名使用、违规扣费 |
加密密钥(如 Laravel APP_KEY、签名密钥) | 会话伪造、冒名登录 |
| OAuth 机密 | 关联应用被接管 |
事实上,.env 被公开是事故的经典戏码。→ .env 曾向全世界公开的故事
泄露的典型模式=存放位置的失误
最大的原因是「把应用本体整个放进公开目录(docroot)」。本该只暴露 public/,结果却公开了它的上级目录,连 .env 都能被取到。
✗ 危险(本体直接放在公开根目录下)
public_html/ ├─ .env ← 能被读到! ├─ app/ └─ public/
✓ 安全(本体在外,只公开 public)
app-root/ ├─ .env ← 无法到达 ├─ app/ └─ public_html/ → public/
防护方法
不要放进公开目录
应用本体放在 docroot 之外,公开的只有 public/ 等。在虚拟主机上的具体步骤见 这篇文章。
不要提交到 git
在 .gitignore 里加入 .env*,只共享把值留空的 .env.example。
泄露后全部轮换
不只是能确认到的那一个,而要把 .env 里的钥匙全部更换。按照已被看到的前提来行动。
定期自查
养成确认自己网站上 /.env 是否能被打开的习惯。
自查(仅限你自己拥有的域名)
# 返回 200 且有正文就说明已公开。403/404 则暂时没问题
curl -sI https://你的域名/.env | head -1
curl -sI https://你的域名/.git/config | head -1养成每次发布都做一次这项确认的习惯,就能及早发现存放位置的失误。
接下来读
FAQ
Q.env 可以提交到 git 吗?
不可以。务必把 .env 加入 .gitignore。作为替代,只提交把值留空的 .env.example,用来共享「需要哪些 key」。
Q.env 哪怕只泄露了一个,要更换什么?
不仅是能确认到的那一个,而要把 .env 里的钥匙全部轮换。优先顺序是「外部 API、OAuth 机密 → 加密密钥 → 邮件 → 数据库」。按照已被看到的前提来行动才安全。
Q怎么确认 .env 是否泄露了?
用浏览器打开自己网站的 https://你的域名/.env,如果内容被显示出来,就说明已经公开了(返回 200 且能看到正文就出事了)。如果没显示而是 403/404,那暂时没问题。