因此,从在线的文档和无数示例中可以很明显地看出,您可以将参数绑定在通过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"
}]}
,表示绑定无效。那...怎么办?
答案 0 :(得分:0)
据我所知,没有一种方法可以将参数绑定到WHERE
子句之外的任何内容-这确实很不幸,因为他们决定将“保留策略”作为数据层次结构的一部分(? ??)。
但是,幸运的是,对于这种确切的情况,有一个简单的解决方法,因为InfluxQL持续时间字面量是一种非常简单且规则的语法。您可以做的就是将用户的输入限制为一组严格的持续时间,例如{'1hr', '5m', '1m'}
,也可以针对此正则表达式进行验证:
[0-9]+([unµm]?s|m|h|d|w)
应该足以完全捕获所有有效输入,而排除所有其他输入。 (这就是我所决定的。)