如何在EJS和Node中隐藏HTML和其他内容

时间:2014-01-31 17:08:16

标签: html node.js ejs

在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 /密码系统的保护,并且只能通过Express提供。

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

有关如何解决这个问题的任何建议吗?

2 个答案:

答案 0 :(得分:0)

嗯,你事后发现的事情。

这:

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

非常糟糕。它应该是:

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

就是这样,你也可以下载我们的代码。因此,server.js可供下载。让人惊讶。

生活和学习。

但是,无需通过我的身份验证即可下载内容。

答案 1 :(得分:0)

如果其他人想要这样做,请花一点时间。有一些问题,因为您仍然需要能够直接访问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\/.*$/));