launch.json中硬编码密码是高危操作,必须改用${env:var_name}引用系统环境变量,并配置skipfiles排除敏感文件、address限定为localhost以防调试端口暴露。

launch.json里写密码就是高危操作
直接在launch.json的env字段里填"DB_PASSWORD": "123456",等于把钥匙贴在门上。VS Code调试启动时会把整个env对象注入进程,一旦调试日志被导出、截图或上传到CI系统,密钥就彻底暴露。
真正安全的做法只有一条:用${env:VAR_NAME}引用系统环境变量。比如:
{
"env": {
"DB_PASSWORD": "${env:DB_PASSWORD}",
"API_KEY": "${env:API_KEY}"
}
}
- 必须提前在操作系统层面设置这些变量(Windows用系统属性→环境变量;macOS/Linux在
~/.zshrc或/etc/environment里export) - 不要在
.bash_profile里用source .env——VS Code终端可能不加载该文件,导致变量为空 - 验证是否生效:在调试中打开Debug Console,输入
process.env.DB_PASSWORD,返回undefined说明没加载成功
调试时别让敏感文件进断点范围
VS Code默认会在所有JS文件里响应断点,但如果你项目里有.env、config/secrets.json这类文件,不小心点错行号设了断点,调试器就会尝试读取并显示其内容——哪怕你没主动console.log,变量窗也可能自动展开明文。
解决方法是明确排除路径:
"skipFiles": [ "**/.env", "**/secrets.json", "**/id_rsa" ]
-
skipFiles写在launch.json的配置项里,和program同级 - 通配符
**匹配任意层级,*只匹配当前目录 - 如果用了TypeScript,还要加
"outFiles": ["${workspaceFolder}/dist/**/*.js"],否则断点会打在编译后文件上,源码映射失效
调试端口暴露=远程可接管进程
Node.js调试协议(V8 Inspector)默认监听localhost:9229,但如果你用了--inspect=0.0.0.0:9229或address: "0.0.0.0",任何能连上你机器IP的人,都能用Chrome chrome://inspect连接并执行任意代码。
检查你的launch.json是否包含以下危险配置:
-
"address": "0.0.0.0"→ 改成"address": "localhost"(默认值,可省略) -
"port": 9229且没配"address"→ 安全,因为localhost绑定不对外网开放 - 用
nodemon --inspect-brk启动 → 确保命令里没带0.0.0.0,正确写法是nodemon --inspect-brk=127.0.0.1:9229 index.js
Debug Console不是安全沙盒
调试时打开Debug Console,输入require('fs').readFileSync('./.env', 'utf8'),它真能执行——而且不会触发任何权限警告。这地方没有沙箱,所有Node API都可用。
这意味着:
- 别在Debug Console里随意执行未知代码片段
- 如果团队共用同一台开发机,退出VS Code前务必关闭所有调试会话(否则
node --inspect进程还在后台跑) - 远程调试(attach模式)时,确保目标机器防火墙已屏蔽
9229端口,除非你明确需要外网接入
最易被忽略的是skipFiles和address这两项——它们不报错、不警告,但只要漏配一个,敏感数据就可能在你毫无察觉时流出去。











