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.templateNext.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
*.ascFirebase 和云服务
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 Secrets | CI/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 模板
- [ ] 理解私钥证书的忽略方式
- [ ] 知道意外提交后的处理流程
