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

时间:2019-07-18 22:41:53

标签: http code-injection influxdb influxql

因此,从在线的文档和无数示例中可以很明显地看出,您可以将参数绑定在通过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"
}]}

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

1 个答案:

答案 0 :(得分:0)

据我所知,没有一种方法可以将参数绑定到WHERE子句之外的任何内容-这确实很不幸,因为他们决定将“保留策略”作为数据层次结构的一部分(? ??)。

但是,幸运的是,对于这种确切的情况,有一个简单的解决方法,因为InfluxQL持续时间字面量是一种非常简单且规则的语法。您可以做的就是将用户的输入限制为一组严格的持续时间,例如{'1hr', '5m', '1m'},也可以针对此正则表达式进行验证:

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

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