我使用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方法? 如果没有,我可以使用任何节点模块吗?
答案 0 :(得分:0)
您可以创建一个mixin来验证您收到的JSON。
例如:
module.exports = function(Model, options) {
Model.beforeRemote('find', (ctx, instance, next) => {
// Validate the filter object
}
}
答案 1 :(得分:0)
感谢帮助人员!
我关闭了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本身都没有为此提供任何解决方案,这真的很奇怪。我的意思是,这些参数是在框架代码中定义和处理的。有点疯狂,没有任何内置的逃避。