如何保护请求的url在NodeJS上不去?

我正在努力为了自己的目的在纯NodeJS中开发简单的服务器。 我最近意识到的问题是,在我的本地机器上,通过在path../../../添加诸如../../../东西,有一点可能性, 我的服务器如下所示:

 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); }); }); 

所以我想知道什么是防止这种事情的最好方法?

假设您的Web文件的根目录是/web/files并且您希望确保不处理该层次结构之外的任何请求。 你可以使用path.normalize()来处理所有的. 然后在其中检查这样的结果path:

 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() 。 它解决了所有. 以及一个path中的分段,这样你就可以看到真正的path是什么样子,然后看看它是否仍然是一条合法的path。


或者,在一个效用函数中:

 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 } 

只需使用Express.js静态文件 。