You need to enable JavaScript to run this app. Express路由中如何将userid参数与当前登录用户ID绑定
优惠活动
大模型
产品
解决方案
定价
更多

Express路由中如何将userid参数与当前登录用户ID绑定

正确实现方案

首先排查session不生效的核心原因

  • 先确认你已正确配置express-session中间件,必须在路由注册前完成配置,示例配置参考:
const session = require('express-session');
app.use(session({
  secret: '你的自定义加密密钥', // 必须配置
  resave: false,
  saveUninitialized: false,
  cookie: { maxAge: 24 * 60 * 60 * 1000 } // session有效期按需设置
}))
  • 确认登录接口校验账号密码成功后,已主动将用户ID写入session:req.session.user = 用户ID值,不要漏写这一步
  • 若存在跨域请求,需前端请求配置withCredentials: true,后端CORS配置credentials: true且origin不能设置为*

最优实现方案(彻底避免越权)

直接删除路由路径中的:userid参数,个人页面仅允许查询当前登录用户的信息,完全不需要前端传递用户ID,从根源杜绝越权可能:

// 去掉路径中的userid参数
router.get('/profilePage', function(req, res) {
    const userid = req.session.user
    // 未登录直接返回401或者跳转到登录页
    if (!userid) {
      return res.status(401).send({
        "code": 401,
        "failed": "请先登录"
      });
    }
    // 直接用session中的用户ID查询,完全不依赖前端传参
    pool.query('SELECT id,fullname,avatar,email from users where id = ?',
    [userid], 
   (error, results)=> {
        if (error) {
            console.log("获取用户" + userid + "信息失败", error);
            return res.status(400).send({
                "code": 400,
                "failed": "查询失败"
            });
        }
        if (results.length > 0) {
            const profile = results[0]
            console.log(profile.fullname)
            return res.render("profilePage",{profile});
        }
        console.log('未查询到对应用户信息')
        return res.status(404).send({
            "code":404,
            "failed":"用户不存在"
        })
    });
});

兼容保留userid参数的方案

如果必须保留路径中的:userid参数,需要增加参数与session用户ID的校验,不一致则返回403禁止访问:

router.get('/profilePage/:userid', function(req, res) {
    const loginUserId = req.session.user
    // 未登录校验
    if (!loginUserId) {
      return res.status(401).send({
        "code": 401,
        "failed": "请先登录"
      });
    }
    // 越权校验:路径参数和登录用户ID不一致直接拦截
    if (req.params.userid != loginUserId) {
      return res.status(403).send({
        "code":403,
        "failed":"无权访问他人个人页面"
      })
    }
    pool.query('SELECT id,fullname,avatar,email from users where id = ?',
    [loginUserId], 
   (error, results)=> {
        if (error) {
            console.log("获取用户" + loginUserId + "信息失败", error);
            return res.status(400).send({
                "code": 400,
                "failed": "查询失败"
            });
        }
        if (results.length > 0) {
            const profile = results[0]
            return res.render("profilePage",{profile});
        }
        return res.status(404).send({
            "code":404,
            "failed":"用户不存在"
        })
    });
});

额外注意事项

  • 不要使用SELECT *查询用户表,明确指定需要返回的字段,避免密码等敏感字段泄露到前端模板
  • 所有异常分支都要添加明确的返回值,不要留空逻辑,避免请求挂起

内容的提问来源于stack exchange,提问作者Yunes Argash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:36:03