【问题标题】:Bind parameter to time dimension argument InfluxDB将参数绑定到时间维度参数 InfluxDB
【发布时间】:2019-07-18 22:41:53
【问题描述】:

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

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

【问题讨论】:

    标签: http code-injection influxdb influxql


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-07
      • 1970-01-01
      • 2019-11-05
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      • 2011-06-11
      相关资源
      最近更新 更多