node.js在服务器目录中提供HTML文档

时间:2015-12-12 16:34:55

标签: javascript node.js security

所以我有一个非常简单的问题,目前我的服务器文件和HTML文档都存在于同一目录中。但是,我已经意识到这导致了一个非常烦人的问题。如果我是用户输入:

http://localhost:3000/HTML/homepage.html

服务器向他们提供HTML文档,通常他们必须通过登录,并在访问主页之前验证其会话ID。

有没有办法拒绝访问服务器目录中保存的文件?

我的代码当前运行的示例:

var http = require('http'),
    fs = require('fs');

var path = require("path");
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser')
var session = require('express-session')

var sqlite3 = require('sqlite3').verbose();
var express = require('express');
var app = express();



var server = app.listen(3000, function () {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s', host, port);
});

app.use(bodyParser());
app.use(express.static(__dirname));


app.get('/signin', function (req, res) {
    res.sendFile(path.join(__dirname + '/HTML/signin'));
});

app.post('/signin', function (req, res) {
    var email = req.body.email;
    var password = req.body.password;


    if (email!="" || password != ""){
        req.session.sessID = email //using email for example purposes

        res.setHeader('Content-Type', 'application/json' );
        res.send(JSON.stringify({
            success: true //the client then catches the JSON, and will redirect to http://localhost:3000/homepage
        }));
    }
}

app.get('/homepage', function(req, res){
    if (req.session.sessID == undefined){
        res.send("You must login first!")
    }else{
        res.sendFile(path.join(__dirname + '/HTML/homepage.html'));
    }
}

1 个答案:

答案 0 :(得分:2)

问题的根源是:

app.use(express.static(__dirname));

这告诉express要提供它可以在你的硬盘驱动器上从app目录中找到的任何文件。这是不可取的。如果在浏览器中输入正确的路径,这甚至会提供您的私人服务器源代码文件。

您应该区分静态文件和动态处理的路由,并确保它们之间不存在冲突。

一个常见的设计是在硬盘驱动器上为静态HTML文件(而不是您的应用程序目录)指定一个单独的目录,然后设置快速静态路由到那里。并且,确保静态路由不会满足您的任何动态路由。

例如,如果静态HTML文件位于HTML目录下的子目录__dirname中,则可以执行此操作:

app.use(express.static(path.join(__dirname, "HTML")));

然后确保您的动态HTML文件(例如homepage.html)都不在该目录中(将它们放在express.static()将看不到的其他地方)。

如果您实际上不希望用户能够看到除自定义路线之外的任何内容,那么请完全摆脱app.use(express.static(__dirname));行,只为您正在服务的每个页面创建自定义路线。