为了我自己的目的,我试图在纯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);
});
});
所以我想知道保护这些东西的最佳方法是什么?
答案 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
}