好的,阿杰 👍,下面给你整理一份 《JavaScript 安全编码:10 个关键实践》,涵盖前端与 Node.js 环境,兼顾防护常见漏洞和最佳实践。


JavaScript 安全编码:10 个关键实践


1️⃣ 输入验证(Input Validation)

概念:所有用户输入都可能是恶意的。
实践

  • 对表单、URL 参数、JSON 数据进行严格校验
  • 使用白名单验证(例如允许的字符、长度、格式)
  • Node.js 可用 validator.js
const validator = require('validator');
if (!validator.isEmail(userInput.email)) {
    throw new Error('Invalid email');
}


2️⃣ 避免直接操作 DOM(防止 XSS)

概念:跨站脚本(XSS)通过插入恶意 JavaScript 改变页面行为。
实践

  • 使用 textContent 而非 innerHTML 渲染用户输入
  • 对动态 HTML 进行转义
  • 前端框架(React / Vue)自动做了转义,可减少 XSS
// 不安全
div.innerHTML = userInput;

// 安全
div.textContent = userInput;


3️⃣ 使用安全的第三方库

概念:第三方库可能存在漏洞或恶意代码。
实践

  • 定期检查 npm audit 报告
  • 只使用维护活跃的库
  • 避免直接从未验证来源下载
npm audit fix


4️⃣ 防止命令注入(Node.js 环境)

概念:攻击者可能通过拼接命令执行恶意 shell 指令。
实践

  • 使用 child_process.spawn 而非 exec 拼接命令
  • 严格过滤外部输入
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);


5️⃣ 安全处理密码与敏感信息

实践

  • 使用 bcrypt / argon2 哈希密码,不要存明文
  • 使用 .env 文件或 Secret Manager 管理 API Key
  • 不要在前端暴露敏感信息
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12);


6️⃣ 防止 CSRF(跨站请求伪造)

概念:攻击者诱导用户在已认证网站执行操作。
实践

  • 对表单使用 CSRF Token
  • 使用 SameSite Cookie 属性
  • Node.js 框架可用 csurf 中间件
app.use(csurf());


7️⃣ 内容安全策略(CSP)

概念:CSP 限制网页加载的脚本、样式和资源来源,降低 XSS 风险。
实践

Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com;

  • 只允许信任来源的脚本和资源

8️⃣ 防止对象原型污染(Prototype Pollution)

概念:恶意输入篡改对象原型,导致安全漏洞。
实践

  • 不直接使用 _.mergeObject.assign 合并外部对象
  • 使用安全库 lodashmergeWith 严格过滤
const safeMerge = require('lodash.mergewith');
safeMerge(obj, userInput, (objValue, srcValue, key) => {
  if (key === '__proto__') return objValue; // 阻止污染
});


9️⃣ 错误处理与日志安全

实践

  • 不在前端显示敏感错误信息
  • 日志中避免输出密码、Token 等
  • 使用集中日志管理系统(如 ELK / Grafana)
try {
  await riskyOperation();
} catch (err) {
  console.error('Operation failed');
}


🔟 定期更新依赖和 Node.js 版本

概念:漏洞随时被发现,过期版本容易被攻击。
实践

  • 使用 npm auditnpm outdated
  • 使用 LTS 或最新稳定 Node.js
  • 配合 Dependabot 或 Renovate 自动更新
npm outdated
npm update


⚡ 总结

安全实践核心意义
输入验证防止注入攻击
避免直接 DOM 操作防止 XSS
使用安全库避免漏洞与恶意代码
命令注入防护Node.js 安全执行
密码与密钥安全防止泄露
防 CSRF防止伪造请求
CSP限制加载源
原型污染防护防止对象篡改
错误与日志安全避免敏感信息泄露
更新依赖防止已知漏洞