security - Node.js 泄漏路径信息,如何解决?

标签 security node.js

我有一个正在运行的网络服务器...如果我从另一台服务器上 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/

相关文章:

security - "an introduction to openssl programming."文章。过期证书

node.js - 有没有办法像我们在bunyan CLI 中显示的那样显示winston 日志文件?

sql - SQL Server 相当于 Oracle 的虚拟专用数据库吗?

java - 替代小程序的替代技术?

node.js - Mongoose:将 addToSet 与 ObjectIds 一起使用会导致孤立 ID

javascript - Node ,从 JSON 文件读取返回一个空数组

jquery - 快速路线注册 Ajax 返回 POST http ://localhost:3004/signup/404

node.js - 如何从 Docker 服务将 Node.js 应用程序连接到 http Rest API?

ios - 使用 iPhone 应用程序分发 SSH key

android - 其他应用程序可以访问帐户管理器中的用户数据