如何保护请求的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静态文件 。