我有一个正在运行的网络服务器...如果我从另一台服务器上 curl 。类似这样的事情:
curl http://myserver.com/../../../../../etc/rsyslog.conf
然后我就可以看到服务器信息了。
这是一个已知问题吗?
更新 这是我的服务器代码:
app = express.createServer(
gzip.staticGzip(__dirname + '/public', {maxAge:5000 }),
express.cookieParser(),
express.bodyParser()
);
得到了这样的修复:
var urlSecurity = function () {
return function (req, res, next) {
if (req.url.indexOf('../') >=0) {
res.send('<div>Server Error</div>' , 500);
} else if (req.url.indexOf('/..') >=0) {
res.send('<div>Server Error</div>' , 500);
} else {
next();
}
}
}
app = express.createServer(
urlSecurity (),
gzip.staticGzip(__dirname + '/public', {maxAge:5000 }),
express.cookieParser(),
express.bodyParser()
);
这足够好吗?
最佳答案
您的程序存在严重的安全缺陷。立即修复。
根据所呈现的症状,我最好的猜测是您正在做类似的事情:
http.createServer(function (request, response) {
var file = path.resolve('/path/to/files', request.url)
fs.createReadStream(file).pipe(response)
})
这是极其不明智的!始终清理用户输入。在这种情况下,这很简单:
http.createServer(function (request, response) {
var requestedFile = path.join('/', request.url);
var file = path.join('/path/to/files', requestedFile)
fs.createReadStream(file).pipe(response)
})
因此,首先我们将请求的 URL path.join
到 '/'
上。这将消除任何 ..
恶作剧,使其更加卫生。然后,我们 path.join
将其添加到我们的 url 上。
在这种情况下为什么使用path.join
而不是path.resolve
?因为 path.join
只是连接路径部分,而不是解析它们,因此前导 /
不会产生任何不良影响。
关于security - Node.js 泄漏路径信息,如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10521826/