【问题标题】:Big problem with security (JWT NodeJS), one token for all acces安全性大问题(JWT NodeJS),一个令牌用于所有访问
【发布时间】:2019-06-19 10:29:07
【问题描述】:

我的 Web 应用程序的安全性确实存在很大问题。 我在用户登录我的应用程序时实现了 JWT 令牌(REST API 返回令牌)。

在我的 jwt 令牌中,我只有用户 ID。问题是,当我想登录 ID = 1 的用户时,

我可以使用相同的令牌查看并执行所有其他用户的休息操作。例如:

当我查看 userId = 1 时,我执行 GET 操作:/api/users/1 并且我有关于用户 1 的信息。但我可以执行操作 /api/users/2、3 等。

一个令牌。如何保护它?

const jwt = require('jsonwebtoken');
const env = require('../config/env.config.js');

module.exports = (req, res, next) => {
  try {
    const token = req.headers.authorization.split(' ')[1];
    const decoded = jwt.verify(token, env.SECRET_KEY);
    req.userData = decoded;
    next();
  } catch (error) {
    return res.status(401).json({
      message: 'Auth failed',
    });
  }
};

【问题讨论】:

  • 确保在这些 API 端点中执行操作的用户是被更新的同一用户?
  • 您的应用程序必须强制执行您的授权规则。响应用户信息请求的代码必须检查会话并验证代理用户是否有权查看请求的信息。
  • @zack6849,我编辑了我的帖子。此错误存在于所有休息操作中(发布、获取、放置等...)
  • 那么编辑在调用这些 REST 端点时运行的代码以执行我所说的操作?
  • @zack6849 我添加了我的 checkAuth 中间件

标签: javascript node.js rest jwt


【解决方案1】:

我认为最好的解决方案是创建中间件来检查发送者的 id 并将其附加到路由,类似于下面

const middleware = (req, res, next) => {
  const id = req.params.id || req.body.id || req.query.id
  if (req.userData.id === id) {
    next()
  } else {
    res.status(403).send({message: "forbidden"})
  }
}
router.get("/api/users/:id", middleware, (req, res) => {
  // do your staff
  res.send({message: "ok"})
})
router.put("/api/users/:id", middleware, (req, res) => {
  // do your staff
  res.send({message: "ok"})
})

【讨论】:

    猜你喜欢
    • 2018-10-16
    • 2015-05-06
    • 2016-12-20
    • 2014-10-30
    • 2018-01-02
    • 1970-01-01
    • 2018-04-26
    • 2011-11-15
    • 2017-08-28
    相关资源
    最近更新 更多