JavaScript 应用程序安全:十大常见漏洞实战解析

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 JavaScript 应用程序安全不是可选项,而是必需品

JavaScript(尤其是在 Node.js 平台上)已成为构建客户端和服务器端应用程序的主流语言。然而,随着其流行度的增长,攻击数量也在增加。根据 OWASP 的数据,大多数入侵事件都是由可以预防的典型错误造成的。在本文中,我们将通过真实的代码示例和防护方法,深入分析 JavaScript(Node.js)十大漏洞。无论您是初学者还是经验丰富的开发者,只要希望加强项目的安全性,本文都将为您提供帮助。



1. 注入攻击(SQL、NoSQL、命令注入)

注入攻击仍然是最危险的漏洞类别。在 Node.js 中,MongoDB 和 PostgreSQL 经常受到影响。



易受攻击的代码示例(NoSQL 注入):

// 易受攻击的代码app.post('/login', async (req, res) => {  const { username, password } = req.body;  const user = await db.collection('users').findOne({    username: username,    password: password  });  // 如果传入 { "username": { "$ne": null }, "password": { "$ne": null } },将返回第一个用户});


如何修复:

  • 使用支持参数化的 ORM/ODM(如 Mongoose、Sequelize)。
  • 验证并清理输入数据(使用 validator 或 joi 库)。
  • 对于命令执行,使用 execFile 代替 exec。


2. 跨站脚本攻击(XSS)

XSS 允许攻击者将恶意脚本注入到其他用户浏览的页面中。



易受攻击的代码示例(反射型 XSS):

// 易受攻击的 Express 路由app.get('/search', (req, res) => {  const query = req.query.q;  res.send(`<h1>搜索结果:${query}</h1>`);  // 如果传入 ?q=<script>alert('XSS')</script>,脚本将被执行});


防护措施:

  • 转义输出:使用 res.render 配合模板引擎(EJS、Pug)或 encodeURIComponent。
  • 设置 HTTP 头 Content-Security-Policy。
  • 在客户端不要使用 innerHTML,改用 textContent。


3. 不安全的身份验证和会话管理

身份验证薄弱是数据泄露的主要原因之一。开发者经常硬编码密钥或使用弱密码。



典型错误:

  • 以明文形式存储密码(应使用 bcrypt/argon2)。
  • 使用可预测的 JWT 密钥(如 secret123)。
  • 缺少登录尝试次数限制。


正确实现示例:

const bcrypt = require('bcrypt');const saltRounds = 12;

app.post('/register', async (req, res) => { const hash = await bcrypt.hash(req.body.password, saltRounds); // 将 hash 保存到数据库});

app.post('/login', async (req, res) => { const user = await db.getUser(req.body.username); const match = await bcrypt.compare(req.body.password, user.passwordHash); if (match) { // 创建具有较短有效期的 JWT const token = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: '15m' }); res.json({ token }); }});


4. SSRF(服务器端请求伪造)

SSRF 漏洞允许攻击者诱使服务器向内部资源(例如云服务商的元数据)发起请求。



示例:

// 易受攻击的代码:通过 URL 加载头像app.post('/avatar', async (req, res) => {  const { url } = req.body;  const response = await fetch(url); // 可以传入 http://169.254.169.254/latest/meta-data/  // 处理响应});


防护措施:

  • 创建允许访问的域名白名单。
  • 阻止

博客

书籍推荐