Javascript 在EJS页面呈现中访问用户数据的正确方法

Javascript 在EJS页面呈现中访问用户数据的正确方法,javascript,node.js,mongodb,mongoose,ejs,Javascript,Node.js,Mongodb,Mongoose,Ejs,我有一个应用程序,与大多数应用程序一样,用户注册后,他们的数据会使用Mongoose保存在MongoDB的用户文档中 现在需要知道的重要一点是,我正在使用Node.js&使用EJS诱人的引擎在每个路由中呈现我的页面 呈现页面的示例: app.get('/profile',isLoggedIn,function(req, res) { res.render('profile.ejs', { user: req.user }); }); <body ng-i

我有一个应用程序,与大多数应用程序一样,用户注册后,他们的数据会使用Mongoose保存在MongoDB的用户文档中

现在需要知道的重要一点是,我正在使用Node.js&使用EJS诱人的引擎在每个路由中呈现我的页面

呈现页面的示例:

 app.get('/profile',isLoggedIn,function(req, res) {
    res.render('profile.ejs', {
        user: req.user
    });
});
<body ng-init="getUserPosts('<%= user._id %>')"></body>
现在您可以在上面的代码中看到,我正在检查用户是否为loggedIn&然后将用户对象传递给我的模板。用户对象包含登录用户的整个用户文档

如何使用用户对象:

 app.get('/profile',isLoggedIn,function(req, res) {
    res.render('profile.ejs', {
        user: req.user
    });
});
<body ng-init="getUserPosts('<%= user._id %>')"></body>
在前端,当用户访问他们的配置文件时,我使用
user:req.user
对象访问已签名的用户文档
ID
,并使用该文档获取与该用户相关的信息

例如:

<button ng-click="savePost('<%= user._id %>')">Send</button>
  • 获取与登录用户ID匹配的所有注释
  • 获取与登录用户ID匹配的所有帖子
  • 这里有一个例子:

     app.get('/profile',isLoggedIn,function(req, res) {
        res.render('profile.ejs', {
            user: req.user
        });
    });
    
    <body ng-init="getUserPosts('<%= user._id %>')"></body>
    
    
    
    上述方法非常有效,我多次使用相同的技术,我需要用户ID来获取与该用户相关的数据或发布到该用户帐户,例如:

    <button ng-click="savePost('<%= user._id %>')">Send</button>
    
    发送
    
    上面找到具有给定ID的用户(始终是loggedIn用户)将帖子保存到其帐户

    问题:

     app.get('/profile',isLoggedIn,function(req, res) {
        res.render('profile.ejs', {
            user: req.user
        });
    });
    
    <body ng-init="getUserPosts('<%= user._id %>')"></body>
    
    现在,我的代码工作正常,我没有遇到任何问题,但我注意到,当我在任何浏览器中检查我的页面时,我都可以清楚地看到用户ID。下面是一幅有助于理解我的意思的图像:


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

    根据我的评论,一种方法是加密
    用户。_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>
    

    我遇到的一种方法是过滤掉对象用户的
    \u id
    ,然后发送一个加密值。当服务器接收到加密的
    \u id
    时,它只是对其进行解密,然后正常进行。这意味着真实的
    \u id
    永远不会向用户公开,谁可以在其他地方破坏它。如果要执行类似于
    发送
    的操作,最好进行某种服务器端安全检查-否则没有什么可以阻止某人修改代码并将帖子保存为他们想要的任何人。@JoeClay感谢您的评论。目前,我做的唯一检查是检查用户是否经过身份验证LoggedInUser。你还有什么建议?还是他们的做法完全不同?@AlexLogan感谢你的评论。你能提供一个类似的例子吗?谢谢你的回答!我会尝试一下,让你们知道它是如何运行的。只是出于好奇,你们倾向于使用什么/推荐使用什么来实际执行加密?谢谢你们,你们都帮了大忙。我只是想确定我做事情的方式是正确的。再次感谢!没有正确的方法。对于一个宠物项目,使用id是可以的,但是如果你将要暴露给数百万用户,暴露个人id可能不是那么明智,因为他们可能会利用它攻击你的系统或修改自己的帐户。此外,mongo ID很容易识别,可以准确地告诉黑客您使用的是什么类型的数据库,从而在尝试攻击时为他们提供了优势。@AlexLogan感谢信息伙伴。虽然我的应用程序不会被数百万用户使用,但它仍然会被客户端使用。因此,我将使用您关于加密数据的建议。