powershell执行策略拦截脚本的根源是默认策略限制,应执行set-executionpolicy remotesigned -scope currentuser并重启终端;环境变量密码须用${env:db_password}引用并在系统设置;调试端口必须绑定localhost;vscode无node沙箱,需通过cwd限制路径或外部工具隔离。

PowerShell执行策略拦截脚本,不是权限不够
VSCode终端报 cannot be loaded because running scripts is disabled,90% 是 PowerShell 默认策略在拦,不是你没装 Node 或路径不对。它连 npm start 封装的内部脚本都会卡住,因为 npm 在 Windows 上依赖 .ps1 脚本链。
真正该做的只有一条:Set-ExecutionPolicy RemoteSigned -Scope CurrentUser。这条命令只改当前用户策略,不碰系统级设置,也不需要管理员权限。
- 执行后必须关闭所有已打开的终端面板(Ctrl+Shift+` → 点 × 全部关掉),再新建一个——旧终端不会刷新策略缓存
-
get-ExecutionPolicy -Scope CurrentUser应返回RemoteSigned,否则没生效 - 别用
Bypass或Unrestricted:公司设备可能被组策略强制覆盖,反而导致后续策略冲突
launch.json 里写密码等于贴钥匙在门上
直接在 launch.json 的 env 字段填 "DB_PASSWORD": "123456",调试启动时整个对象会注入进程,日志导出、截图、CI 构建产物里都可能泄露明文。
安全做法只有一种:"DB_PASSWORD": "${env:DB_PASSWORD}",然后在操作系统层面设变量:
- Windows:系统属性 → 高级 → 环境变量 → 用户变量里新增
- macOS/Linux:在
~/.zshrc里加export DB_PASSWORD="xxx",并确保 VSCode 启动时加载了它(terminal.integrated.shellArgs.osx设为["-i"]) - 验证方式:调试中打开 Debug Console,输入
process.env.DB_PASSWORD—— 返回undefined就说明没加载成功
调试端口绑 0.0.0.0 就等于开放远程代码执行
--inspect=0.0.0.0:9229 或 "address": "0.0.0.0" 在 launch.json 里,会让 V8 Inspector 监听所有网络接口。只要有人能访问你机器的 IP 和端口,就能用 chrome://inspect 连进来,执行任意 JS,包括 require('fs').readFileSync('./.env')。
正确配置只有两种:
- 删掉
address字段(默认就是localhost,只响应本地回环) - 显式写
"address": "localhost"或"address": "127.0.0.1" - 如果用
nodemon --inspect-brk,必须带地址:nodemon --inspect-brk=127.0.0.1:9229 index.js,不能省略
VSCode 没有 Node.js 沙箱,文件读写靠系统层约束
VSCode 本身不提供 Node.js 运行时沙箱。fs 模块能读写你当前用户有权限的任何路径——哪怕脚本里只写了 readFileSync('../etc/passwd'),只要用户权限够,它就真能读。
能缩小风险面的操作只有三个:
- 调试时在
launch.json中强制指定"cwd": "${workspaceFolder}/sandbox",让所有相对路径锚定在此目录内 - 避免拼接绝对路径:
path.join('/home/user/', userInput)改成path.resolve(cwd, userInput),再用path.relative(cwd, resolvedPath)校验是否越界 - 真要隔离不可信代码?只能靠外部工具:
sandbox-exec(macOS)、firejail --private=.(Linux)、WSL2 + Docker(Windows)——code-runner插件不支持传这些命令,必须手动进终端运行
最常被忽略的是:VSCode 调试器里的 Debug Console 不是沙盒,它能直接执行任意 Node.js 代码,包括绕过所有 JS 层校验的 fs 操作。别在调试时随手粘贴可疑表达式。











