⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议
Skip to content

8.4.2 密码千万别提交——敏感文件管理

一旦密钥进了 Git 历史,即使删除也还在——所以第一步就要拦住。

敏感信息类型

类型示例风险
数据库密码DATABASE_URL数据泄露
API 密钥OPENAI_API_KEY费用损失
认证密钥JWT_SECRET身份伪造
云服务凭证AWS_SECRET_KEY资源被盗用
私钥证书*.pem, *.key安全漏洞

.env 文件忽略策略

基本配置

gitignore
# 忽略所有环境变量文件
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# 但保留示例文件
!.env.example
!.env.template

Next.js 环境变量规则

gitignore
# 本地环境变量(不提交)
.env.local
.env.*.local

# 通用环境变量(按需提交)
# .env              # 可能包含默认非敏感值
# .env.development  # 开发环境默认值
# .env.production   # 生产环境默认值

.env.example 模板

创建 .env.example 告诉队友需要哪些配置:

bash
# 数据库
DATABASE_URL=postgresql://user:password@localhost:5432/mydb

# 认证
NEXTAUTH_SECRET=your-secret-here
NEXTAUTH_URL=http://localhost:3000

# 第三方服务
OPENAI_API_KEY=sk-xxx
STRIPE_SECRET_KEY=sk_test_xxx

# 可选配置
# REDIS_URL=redis://localhost:6379

原则

  • 保留变量名和格式
  • 用占位符替代真实值
  • 添加简要注释说明用途

私钥与证书

gitignore
# SSL/TLS 证书
*.pem
*.key
*.crt
*.p12
*.pfx

# SSH 密钥
id_rsa
id_ed25519
*.pub  # 公钥可能也要保护

# GPG 密钥
*.gpg
*.asc

Firebase 和云服务

gitignore
# Firebase
firebase-adminsdk-*.json
*-firebase-adminsdk-*.json
firebase-config.json

# Google Cloud
service-account.json
*-credentials.json

# AWS
.aws/credentials

意外提交怎么办

情况 1:还没推送

bash
# 1. 从暂存区移除
git rm --cached .env

# 2. 添加到 .gitignore
echo ".env" >> .gitignore

# 3. 修改上一次提交
git commit --amend

情况 2:已经推送

bash
# 1. 立即更换所有泄露的密钥!

# 2. 使用 git-filter-repo 清理历史(推荐)
pip install git-filter-repo
git filter-repo --path .env --invert-paths

# 3. 强制推送
git push --force-with-lease

# 4. 通知团队重新 clone

重要:即使从历史中删除,也必须更换密钥!因为可能已被他人拉取。

使用 GitHub Secret Scanning

GitHub 会自动扫描常见的密钥格式并发出警告:

  • AWS 访问密钥
  • Google API 密钥
  • OpenAI API 密钥
  • Stripe 密钥
  • 等等

环境变量管理工具

工具特点适用场景
Vercel 环境变量与部署集成Vercel 部署项目
GitHub SecretsCI/CD 使用GitHub Actions
Doppler团队级管理多环境多项目
1Password密码管理器个人开发者

AI 协作注意事项

当向 AI 提问时:

不要

我的 DATABASE_URL 是 postgresql://admin:MyP@ssw0rd@db.example.com:5432/prod
为什么连不上?

应该

我的 DATABASE_URL 格式是 postgresql://user:password@host:5432/database
连接时报错 "connection refused",可能是什么原因?

验收清单

  • [ ] 配置了 .env* 的忽略规则
  • [ ] 创建了 .env.example 模板
  • [ ] 理解私钥证书的忽略方式
  • [ ] 知道意外提交后的处理流程