跳到正文
>_ITDITDWeb 安全平台

术语表

「.env」是什么 — 环境变量文件泄露会发生什么

.env(dot env)是一个配置文件,用来把数据库认证、API key、加密密钥等机密值从应用本体中分离出来保存。它很方便,但一旦放进公开目录,就等于「把一整串钥匙贴在大门上」。本文用图和表通俗讲解它的含义、为什么是最危险的文件、泄露时各种机密分别会发生什么、正确的存放位置、git 与轮换(rotation)的防护方法,以及自查的方式。

发布于 2026-06-07 更新于 2026-06-07 1 分钟阅读

.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/。仅此一点,.env 就变得无法到达。

防护方法

1

不要放进公开目录

应用本体放在 docroot 之外,公开的只有 public/ 等。在虚拟主机上的具体步骤见 这篇文章

2

不要提交到 git

.gitignore 里加入 .env*,只共享把值留空的 .env.example

3

泄露后全部轮换

不只是能确认到的那一个,而要把 .env 里的钥匙全部更换。按照已被看到的前提来行动。

4

定期自查

养成确认自己网站上 /.env 是否能被打开的习惯。

自查(仅限你自己拥有的域名)

# 返回 200 且有正文就说明已公开。403/404 则暂时没问题
curl -sI https://你的域名/.env | head -1
curl -sI https://你的域名/.git/config | head -1

养成每次发布都做一次这项确认的习惯,就能及早发现存放位置的失误。

接下来读

FAQ

Q.env 可以提交到 git 吗?
A

不可以。务必把 .env 加入 .gitignore。作为替代,只提交把值留空的 .env.example,用来共享「需要哪些 key」。

Q.env 哪怕只泄露了一个,要更换什么?
A

不仅是能确认到的那一个,而要把 .env 里的钥匙全部轮换。优先顺序是「外部 API、OAuth 机密 → 加密密钥 → 邮件 → 数据库」。按照已被看到的前提来行动才安全。

Q怎么确认 .env 是否泄露了?
A

用浏览器打开自己网站的 https://你的域名/.env,如果内容被显示出来,就说明已经公开了(返回 200 且能看到正文就出事了)。如果没显示而是 403/404,那暂时没问题。