【问题标题】:The best way to make Loopback GET query parameters safe?使 Loopback GET 查询参数安全的最佳方法?
【发布时间】:2018-01-31 13:00:24
【问题描述】:

我将 Loopback 3.x 与 loopback-connector-mongodb 3.x 一起使用

显然,许多内置端点可以采用可以定义为 JSON 的过滤器参数,它可能包含复杂的过滤器条件,如 order、where、skip 等。例如:

GET /api/activities/findOne?filter={"where":{"id":1234}}

然而,虽然 Loopback 使用 ORM,但似乎请求参数是在没有任何预处理或转义的情况下传递给 mongodb 的。 我找不到任何可以帮助我确保值安全的 Loopback API 方法。 例如,如果用户将 Javascript 放入 where 过滤器,或添加不受支持的字符(例如 null char),则应用会抛出异常并退出。

我确定我在这里遗漏了一些东西。使 filter={...} 中传递的值安全的最佳方法是什么? 有没有内置的 API 方法呢? 如果没有,有没有我可以使用的节点模块?

【问题讨论】:

  • 使用 joi 等模式验证器来验证通过的过滤器
  • 谢谢! Joi 很酷,我一定会用它。

标签: mongodb loopbackjs strongloop


【解决方案1】:

感谢大家的帮助!

我在 MongoDB 中关闭了 Javascript,并编写了一个小中间件来处理转义。这是在 middleware.json 中注册的,因此它在每个请求之前运行并转义值。

  module.exports = function createEscaper(options) {
  return function queryEscape(req, res, next) {
    if (req.query.filter) {
      // escape various things and update the value..
    }
    next();
  };
}

但我觉得很奇怪,MongoDB 连接器和 Loopback 本身都没有为此提供任何解决方案。我的意思是,这些参数是在框架代码中定义和处理的。这有点疯狂,没有任何内置的转义。

【讨论】:

    【解决方案2】:

    您可以创建一个 mixin 来验证您收到的 JSON。

    例如:

    module.exports = function(Model, options) {
       Model.beforeRemote('find', (ctx, instance, next) => {
          // Validate the filter object
       }
    }
    

    【讨论】:

    • 是的,听起来不错,谢谢!我写了一个中间件,有点类似。
    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多