JavaScript应用程序安全:十大漏洞
现代基于Node.js的JavaScript应用程序处理大量敏感数据,使其成为攻击者的诱人目标。根据OWASP的数据,大多数入侵事件都是由可预防的典型错误引起的。本文将分析10种最常见的漏洞,提供真实代码示例,并展示如何保护您的应用程序。
1. XSS(跨站脚本攻击)
跨站脚本攻击是最古老但至今仍然活跃的威胁之一。攻击者将恶意脚本注入网页,该脚本会在受害者的浏览器中执行。
// 有漏洞的代码app.get('/search', (req, res) => { const query = req.query.q; res.send(`<h2>Результаты поиска для: ${query}</h2>`);});
// 安全版本const escapeHtml = (str) => { return str.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, ''');};
app.get('/search', (req, res) => { const query = escapeHtml(req.query.q || ''); res.send(`<h2>Результаты поиска для: ${query}</h2>`);});2. SQL注入
当用户输入直接拼接到SQL查询中时,就会发生SQL代码注入。这可能导致数据泄露或删除。
// 有漏洞的代码const userId = req.body.id;const query = `SELECT * FROM users WHERE id = ${userId}`;
// 使用参数化查询的安全版本const userId = req.body.id;const query = 'SELECT * FROM users WHERE id = ?';db.query(query, [userId], (err, results) => { // 处理结果});3. 不安全的反序列化
Node.js经常使用JSON.parse(),但如果您使用其他格式(例如Buffer),攻击者可能会注入恶意数据。
// 危险的方法const data = JSON.parse(req.body.data); // 可能包含__proto__
// 安全的方法const safeParse = (json) => { const data = JSON.parse(json); // 递归删除危险属性 return JSON.parse(JSON.stringify(data));};4. CSRF(跨站请求伪造)
攻击者诱使用户在其已登录的网站上执行非预期操作的攻击。
// 使用csurf设置保护const csrf = require('csurf');const csrfProtection = csrf({ cookie: true });
app.post('/transfer', csrfProtection, (req, res) => { // 安全处理转账});5. 不安全的身份验证
弱密码、缺乏登录尝试限制以及明文存储密码是常见问题。
// 正确的密码哈希处理const bcrypt = require('bcrypt');
async function createUser(password) { const salt = await bcrypt.genSalt(12); const hash = await bcrypt.hash(password, salt); // 将hash保存到数据库}
async function checkPassword(plainPassword, hash) { return await bcrypt.compare(plainPassword, hash);}6. 敏感数据泄露
向客户端发送错误堆栈或记录密码是开发人员的常见错误。
// 错误做法app.use((err, req, res, next) => { res.status(500).json({ error: err.stack });});
// 正确做法app.use((err, req, res, next) => { console.error(err); // 在服务器端记录日志 res.status(500).json({ error: 'Внутренняя ошибка сервера' });});7. 不安全的配置
使用默认端口、在生产环境中启用调试模式以及弱CORS策略。
// 安全的CORS配置const cors = require('cors');cons