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
相关产品推荐
相关产品推荐

