1

因此,从在线文档和无数示例中,很明显您可以在WHERE通过 HTTP 提交到 InfluxDB 服务器的查询的子句中绑定参数,如下所示:

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"
}]}

这表明绑定不起作用。那么……怎么办?

4

1 回答 1

0

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

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

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

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

于 2019-07-24T19:48:01.480 回答