如何在NodeJS中保护请求URL不被阻塞?

时间:2016-03-23 16:44:39

标签: node.js

为了我自己的目的,我试图在纯NodeJS中开发简单的服务器。我最近意识到的问题是,通过在路径中添加类似../../../之类的内容,可以在本地计算机上从web或其他地方进入上层或其他位置。我的服务器看起来像这样:

var server = require('http').createServer(function(request, response) {
    var file_path = './web' + request.url;

    if (file_path == './web/')
        file_path = file_path + 'index.html';

    var extname = path.extname(file_path);

    switch (extname) {
        case '.js':
            content_type = 'text/javascript';
            break;
        case '.css':
            content_type = 'text/css';
            break;
        case '.json':
            content_type = 'application/json';
            break;
        default:
            content_type = 'text/html';
            break;
    }


    fs.readFile(file_path, 'utf8', function (err, data) {
        if (err) {
            response.writeHead(404);

            return response.end('Error loading ' + request.url);
        }

        response.writeHead(200, {'Content-Type': content_type});

        return response.end(data);
    });
});

所以我想知道保护这些东西的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

只需使用Express.js Static Files即可。

答案 1 :(得分:1)

让我们说您的网络文件的根目录是/web/files,并且您希望确保不处理该层次结构之外的请求。您可以使用path.normalize()处理其中的所有...,然后检查生成的路径,如下所示:

var path = require('path');

var file_path = '/web/files' + request.url;
var resolvedPath = path.normalize(file_path);
if (resolvedPath.indexOf('/web/files/') !== 0) {
    // illegal request
}

您可以阅读path.normalize() here。它会解析路径中的所有...分段,以便您可以查看真实路径的外观,然后查看它是否仍然是合法路径。

或者,在效用函数中:

var path = require('path');

function isPathContained(testPath, containerPath) {
    var resolvedPath = path.normalize(fullPath);
    return resolvedPath.indexOf(containerPath) === 0;
}

然后,你会这样使用:

var webFiles = '/web/files';
var file_path =  webFiles + request.url;
if (!isPathContained(file_path, webFiles)) {
    // illegal request
}