【发布时间】:2016-08-03 02:35:21
【问题描述】:
我有一个应用程序,就像大多数应用程序一样,用户注册,他们的数据使用 Mongoose 保存在 MongoDB 的用户文档中。
现在要知道的重要一点是,我正在使用 Node.js 并使用 EJS Tempting 引擎在每个路由中渲染我的页面。
渲染页面示例:
app.get('/profile',isLoggedIn,function(req, res) {
res.render('profile.ejs', {
user: req.user
});
});
现在您可以在上面的代码中看到我正在检查用户是否已登录,然后将用户对象传递给我的模板。用户对象包含登录用户的整个用户文档。
我如何使用用户对象:
在前端,当用户访问他们的个人资料时,我使用 user: req.user 对象访问签名的用户文档 ID 并使用它来获取与该用户相关的信息。
例如:
- 获取与登录用户 ID 匹配的所有 cmets
- 获取与登录用户 ID 匹配的所有帖子
这是一个例子:
<body ng-init="getUserPosts('<%= user._id %>')"></body>
上述方法完美,我多次使用相同的技术,超时我需要用户 ID 来获取与该用户相关的数据或发布到该用户帐户,例如:
<button ng-click="savePost('<%= user._id %>')">Send</button>
上面找到具有给定 ID 的用户(始终是已登录用户)将帖子保存到他们的帐户。
问题:
现在我的代码完美运行,我没有遇到任何问题,但我注意到,当我在任何浏览器中检查页面元素时,我都可以清楚地看到用户 ID。下面是一张有助于理解我的意思的图片:
现在我知道只有登录用户才能查看自己的 ID。但这仍然是正确的方法吗?这有害吗?我该如何改进?
【问题讨论】:
-
我遇到的一种方法是过滤掉对象用户的
_id并发送加密值。当服务器收到加密的_id时,它只是对其进行解密,然后照常进行。这意味着真正的_id永远不会暴露给用户,用户可能会在其他地方使用它造成损害。 -
如果您要执行
<button ng-click="savePost('<%= user._id %>')">Send</button>之类的操作,最好进行某种服务器端安全检查 - 否则没有什么可以阻止某人只是修改代码并将帖子保存为他们的任何人想要。 -
@JoeClay 感谢您的评论。目前我做的唯一检查是检查用户是否是经过身份验证的登录用户。你还有什么建议?还是他们这样做的方式完全不同?
-
@AlexLogan 感谢您的评论。你能提供一个例子吗?
标签: javascript node.js mongodb mongoose ejs