将参数绑定到时间维度参数 InfluxDB

Bind parameter to time dimension argument InfluxDB

因此,从文档和无数在线示例中可以清楚地看出,您可以在通过 HTTP 提交给 InfluxDB 服务器的查询的 WHERE 子句中绑定参数,如下所示:

curl -G 'http://example.com/query?' \
        --data-urlencode 'q=SELECT * FROM mymeasurement WHERE value > $min' \
        --data-urlencode 'db=mydatabase' \
        --data-urlencode 'params={"min":0}

太棒了,它可以防止代码注入。但是,如果我对事物进行分组怎么办?按时间分组时如何防止代码注入?这个:

curl -G 'http://example.com/query?' \
        --data-urlencode 'q=SELECT * FROM mymeasurement GROUP BY time($interval)'
        --data-urlencode 'db=mydatabase'
        --data-urlencode 'params={"interval":"1m"}'

不起作用。它给了我这样的回应:

{ "results": [{
    "statement_id": 0,
    "error": "time dimension must have duration argument"
}]}

表示绑定无效。那么...怎么办?

据我所知,没有办法将参数绑定到 WHERE 子句之外的任何内容——这真的很不幸,因为他们决定将 "retention policies" 作为数据的一部分层次结构 (???).

幸运的是,对于这种确切的情况,有一个简单的解决方法,因为 InfluxQL 持续时间文字是一种非常简单和规则的语法。您可以做的是将用户的输入限制在一组严格的持续时间,例如{'1hr', '5m', '1m'},或者您可以根据此正则表达式验证它们:

[0-9]+([unµm]?s|m|h|d|w)

这应该足以完全捕获所有有效输入,排除所有其他输入。 (这就是我的决定)。