【问题标题】:How to hide HTML and other Content in EJS and Node如何在 EJS 和 Node 中隐藏 HTML 和其他内容
【发布时间】:2014-02-24 11:50:20
【问题描述】:

在 EJS 中做一个简单的网站很难。

我在我的服务器文件中设置了这个:

    //Use the .html extension instead of having to name the views as *.ejs
    server.engine('.html', require('ejs').__express);

    // This avoids having to provide the extension to res.render()
    server.set('view engine', 'html');

    //set up directory to serve css and javascript files
    server.use(Express.static(__dirname, '/views'));

这很好用。我有 HTML 文件,我有图形,我有 CSS。我用一个呈现页面的简单控制器来提供它。这些页面中没有任何动态。但我确实希望他们使用 id/password 系统进行保护,并且只通过 Express 提供服务。

访问正常,我设置了一个端点来为他们服务。我正在强制登录该端点。但问题是,如果有人知道这些文件的实际路径,他们就可以得到它们。所以,访问是 localhost:8081/admin/documentation/。但是,这些文件位于 /views/app_documents。通过输入 localhost:8081/views/app_documents/file_name.html,他们可以下载/查看内容,而无需通过我的控件。我将内容移出视图,并在我的代码中抓取它,然后提供它,但这不适用于图像或 CSS。

对于如何解决这个问题有什么建议吗?

【问题讨论】:

    标签: html node.js ejs


    【解决方案1】:

    如果其他人想要这样做,需要一段时间。有一些问题,因为您仍然需要能够直接访问 JS 库、图像和 CSS。我在enter link description here找到了我的答案。

    对该代码的以下修改可以解决问题。 UserIsAllowed 检查我的权限系统以查看他们是否可以访问该文件夹。如果他们可以,没有伤害,你走吧。否则,终止尝试。他们将 ACCESS_DENIED 作为字符串返回。我不能直接杀死任何不通过我的代码的人,因为那样 CSS 和图像将无法正常工作。但这很好用。我现在可以根据我的自定义权限系统提供内容,这是许多其他管理功能的一部分。我还可以根据受不同权限保护的 URL 拥有多个不同的区域。

            // This function returns a middleware function. It checks to see if the user has access
        var protectPath = function(regex)
        {
            return function(request, response, next)
            {
                if (!regex.test(request.url)) { return next(); }
    
                userIsAllowed(regex,function(allowed)
                {
                    if (allowed)
                    {
                        next(); // send the request to the next handler, which is express.static
                    }
                    else
                    {
                        response.end('ACCESS_DENIED');
                    }
                });
    
                function userIsAllowed(regex,callback) {
    
                    if (regex.test('documentation_website') && request.session.admin_me && _.contains(request.session.admin_me["privileges"],"view_server_documentation")) callback(true);
                    else callback(false);
                }
            };
        };
    
        server.use(protectPath(/^\/documentation_website\/.*$/));
    

    【讨论】:

      【解决方案2】:

      嗯,事后你会发现。

      这个:

      server.use(Express.static(__dirname, '/views'));
      

      非常糟糕。应该是:

      server.use(Express.static('./views'));
      

      原来如此,您也可以下载我们的代码。因此,server.js 可供下载。哎呀。

      生活和学习。

      不过,仍然可以下载内容而无需通过我的身份验证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多