在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不起作用。
有关如何解决这个问题的任何建议吗?
答案 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\/.*$/));