浏览 AI使用教程
API Key 怎么放环境变量:避免进入仓库、构建产物和日志
把 API Key 放进环境变量只是第一步。仓库历史、构建日志、错误日志和前端产物仍可能泄漏秘密,需要逐处检查并准备轮换。
按实际操作顺序推进
每完成一段就检查当前输出,确认结果符合预期后再继续。
密钥已经移进 .env,为什么仍然可能泄漏
API Key 已从代码移到 `.env`,但 `.env` 被提交,构建日志又打印了完整请求头。所谓使用环境变量并没有消除泄漏。
仅用公开占位值 lesson-not-a-secret;没有访问真实 API,也未执行任何真实密钥轮换。
- 终端和程序只报告是否存在,不回显值
- 本地环境文件被忽略且未跟踪
- 真实泄漏需在服务端撤销,删文件不能使旧凭证失效
动手前,把材料和不能改的部分定下来
| 需要确认 | 本例内容 |
|---|---|
| 现有材料 | Node.js 20.6+、PowerShell、一个练习 Git 仓库;创建 .env.local、.gitignore 和 check-env.mjs。 |
| 不能越过的边界 | 密钥不进入源码、历史、镜像、前端包、日志和截图;生产使用受控 secret store;发现泄漏先撤销轮换。 |
| 要交付的结果 | 密钥位置清单与泄漏检查结果 |
API Key 怎么放环境变量,从“设置一个占位变量”开始做
设置一个占位变量
先用当前终端变量练习读取;关闭窗口后该赋值不持久保存。
改为本地文件
在练习目录创建 .env.local 与忽略规则,确认 Node 版本支持 --env-file。
只输出存在性
服务端通过 process.env 读取,缺失时失败;不要把完整环境或请求头写到日志。
检查 Git 与浏览器边界
忽略规则不影响已经跟踪的文件;检查 git ls-files,并确认密钥没有被打进前端。
再接真实凭证
按供应商自己的权限与撤销机制替换占位值;若真实值曾暴露,先撤销再处理历史。
先用占位值完成设置、读取和忽略
只检查是否存在
const present = Boolean(process.env.DEMO_API_KEY?.trim());
console.log(`DEMO_API_KEY present: ${present}`);
if (!present) process.exitCode = 1;当前终端变量
$env:DEMO_API_KEY = 'lesson-not-a-secret' node check-env.mjs Remove-Item Env:DEMO_API_KEY
文件中的教学占位值
DEMO_API_KEY=lesson-not-a-secret
合并进现有忽略规则,不覆盖原文件
.env.local
读取文件并验证 Git 状态
node --env-file=.env.local check-env.mjs git check-ignore -- .env.local git ls-files -- .env.local
预期第一条输出 true;check-ignore 输出 .env.local;ls-files 无输出。若 ls-files 输出文件名,说明已跟踪,不能因 .gitignore 存在就认为安全。环境中同名变量会优先于 --env-file;先移除教学终端变量再比较。
读取成功之后还要检查哪里
本例程序仅在 Node 服务端读取值。把值放进浏览器 JS、静态构建变量或返回给页面,就会向访问者公开;环境变量并不自动保密。
忽略文件只解决今后的常规添加。曾提交真实值时要在供应商控制台撤销;历史改写会影响协作者,应另行规划。扫描结果不能证明所有日志和缓存都没有副本。
语法与覆盖关系参见 [Node --env-file](https://nodejs.org/api/cli.html#--env-filefile)。
完成后的密钥位置清单与泄漏检查结果
预期只输出 DEMO_API_KEY present: true;git check-ignore 命中 .env.local。这个结果只证明本地读取与忽略规则,不证明 Git 历史、CI、前端包或真实服务轮换安全。
为什么“仓库扫描无密钥,浏览器仍能看到 Key”还不能交付
仓库扫描无密钥,浏览器仍能看到 Key
- 原因
- 变量被注入前端构建或接口返回
- 怎么改
- 检查最终 JS 包和网络请求,服务器端代理敏感调用,立即轮换已暴露凭证
