【问题标题】:The correct way of accessing user data within page rendering in EJS在 EJS 中的页面渲染中访问用户数据的正确方法
【发布时间】: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 并使用它来获取与该用户相关的信息。

例如:

  1. 获取与登录用户 ID 匹配的所有 cmets
  2. 获取与登录用户 ID 匹配的所有帖子

这是一个例子:

<body ng-init="getUserPosts('<%= user._id %>')"></body>

上述方法完美,我多次使用相同的技术,超时我需要用户 ID 来获取与该用户相关的数据或发布到该用户帐户,例如:

<button ng-click="savePost('<%= user._id %>')">Send</button>

上面找到具有给定 ID 的用户(始终是已登录用户)将帖子保存到他们的帐户。

问题:

现在我的代码完美运行,我没有遇到任何问题,但我注意到,当我在任何浏览器中检查页面元素时,我都可以清楚地看到用户 ID。下面是一张有助于理解我的意思的图片:

现在我知道只有登录用户才能查看自己的 ID。但这仍然是正确的方法吗?这有害吗?我该如何改进?

【问题讨论】:

  • 我遇到的一种方法是过滤掉对象用户的_id 并发送加密值。当服务器收到加密的_id 时,它只是对其进行解密,然后照常进行。这意味着真正的_id 永远不会暴露给用户,用户可能会在其他地方使用它造成损害。
  • 如果您要执行&lt;button ng-click="savePost('&lt;%= user._id %&gt;')"&gt;Send&lt;/button&gt; 之类的操作,最好进行某种服务器端安全检查 - 否则没有什么可以阻止某人只是修改代码并将帖子保存为他们的任何人想要。
  • @JoeClay 感谢您的评论。目前我做的唯一检查是检查用户是否是经过身份验证的登录用户。你还有什么建议?还是他们这样做的方式完全不同?
  • @AlexLogan 感谢您的评论。你能提供一个例子吗?

标签: javascript node.js mongodb mongoose ejs


【解决方案1】:

根据我的评论,一种方法是加密 user._id 值,然后将其发送给客户端。

app.get('/profile',isLoggedIn,function(req, res) {
    var user = req.user;
    user._id = encrypt(user._id);
    res.render('profile.ejs', {
        user: user
    });
});

这意味着在你得到的 html 中

<button ng-click="savePost('someEncryptedValue')">Send</button>

您的原始 mongo id 不再向客户端公开。

在后端,您将首先解密该值,然后照常进行。

app.get(/userPosts,function(req,res){
    var userId = decrypt(req.query.id);
    Posts.find({userId:userId},function(err,posts){
        res.send(posts);
    });
});

【讨论】:

  • 感谢您的回答!我会试试这个,让你知道它是怎么回事。
  • 出于好奇,您倾向于使用/推荐使用什么来实际执行加密?
  • 谢谢你们,你们俩都帮了大忙。我只是想确保我以正确的方式做事。再次感谢!
  • 没有正确的方法。对于一个宠物项目,使用 id 很好,但是如果您要接触数百万用户,那么公开个人 id 可能就不那么明智了,因为他们可以使用它来攻击您的系统或修改他们自己的帐户。 mongo id 也很容易识别,告诉黑客你正在使用什么样的数据库,如果有人尝试攻击,他们就会有优势。
  • @AlexLogan 感谢您提供信息。虽然我的 App 不会被数百万用户使用,但它仍然会被客户使用。所以我会使用你对数据加密的建议。
猜你喜欢
  • 2011-03-19
  • 2013-01-27
  • 2021-03-08
  • 2020-06-23
  • 1970-01-01
  • 2018-04-26
  • 2019-10-05
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多