好的,阿杰 👍,下面给你整理一份 《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)
概念:恶意输入篡改对象原型,导致安全漏洞。
实践:
- 不直接使用
_.merge
或Object.assign
合并外部对象 - 使用安全库
lodash
的mergeWith
严格过滤
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 audit
和npm outdated
- 使用 LTS 或最新稳定 Node.js
- 配合 Dependabot 或 Renovate 自动更新
npm outdated
npm update
⚡ 总结
安全实践 | 核心意义 |
---|---|
输入验证 | 防止注入攻击 |
避免直接 DOM 操作 | 防止 XSS |
使用安全库 | 避免漏洞与恶意代码 |
命令注入防护 | Node.js 安全执行 |
密码与密钥安全 | 防止泄露 |
防 CSRF | 防止伪造请求 |
CSP | 限制加载源 |
原型污染防护 | 防止对象篡改 |
错误与日志安全 | 避免敏感信息泄露 |
更新依赖 | 防止已知漏洞 |
发表回复