【问题标题】:How can I securely build paths from url segments?如何安全地从 url 段构建路径?
【发布时间】:2012-08-14 03:04:46
【问题描述】:

我有以下代码:

app.get('/games/:id/log', function (req, res) {
    fs.readFile('logs/' + req.params.id +'.log', 'utf8', function (err, data) {
        res.send(data.split('\n').join('\<br />'));
    });
});

这允许访问mysite.com/games/somename/log 来提供./logs/somename.log。但是,我担心req.params.id 最终会变成像../.. 这样的邪恶分子,读取我不想被看到的文件。

这可能吗?如果是这样,我该如何解决这个安全问题?

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    我会创建一个您允许在您的 id 中使用的字符的白名单。我的猜测是您的 id 只能是字母字符。因此,运行测试将允许您拒绝所有其他值。

    var id = req.params.id.match(/[A-Z]+/i
        id = id[0] || null
    
    if (id) {
      // read file `id`
    }
    

    这将清除您的输入,只允许大写和小写字母字符。您还可以测试输入是否有有效字符,而不仅仅是清理它。

    var reg = /^[A-Z]+$/i
    
    
    if (reg.test(req.params.id)) {
      // read file `req.params.id`
    }
    

    另请注意:您将永远无法将../.. 作为id 的值,因为它与您的路由不匹配。

    您可以通过req.route查看有关路由的更多信息

    您的路线示例如下:

    { path: '/games/:id/log',
      method: 'get',
      callbacks: [ [Function] ],
      keys: [ { name: 'id', optional: false } ],
      regexp: /^\/games\/(?:([^\/]+?))\/log\/?$/i,
      params: [ id: 'asd' ] } [ id: 'asd' ]
    }
    

    http://expressjs.com/api.html#req.route

    【讨论】:

    • "您将永远无法将 ../.. 作为 id 的值,因为它与您的路由不匹配。" - id 可以匹配任何内容那么不安全呢?如果没有,是否记录在案?
    • 查看编辑:您可以通过 req.route 查看有关路由的更多信息
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2020-10-10
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多