插入到InfluxDB时,字符串末尾的反斜杠会导致错误

时间:2018-02-13 19:19:09

标签: ruby escaping influxdb

我有一个字符串:

string = "\\"
puts string
# => \

我将其插入到一个新字符串并发送到数据库。但是,数据库(InfluxDB)使用反斜杠作为转义字符,因此推送此字符串可能会导致错误。

例如,如果我将以下内容传递给Influx,则会导致“未终止字符串”错误:

insert_cmd = <<-TXT
  INSERT INTO my_db.default.my_measurement,my_tag=1 my_val="#{string}"
TXT

我的问题是如何用\(两个实际的反斜杠)替换字符串中的\\

我让它与gsub("\\", "\\\\\\")合作,但我不明白为什么会这样,以下情况不会:

string.gsub("\\", "\\\\")
# SyntaxError: (irb):10: syntax error, unexpected $undefined, expecting end-of-input

为什么这不起作用?为什么gsub("\\", "\\\\\\")有效?还有更好的方法吗?

解决

正如我在评论中提到的,实际上我并没有手动插入到INSERT INTO字符串中。我正在使用Influxdb-ruby:

INFLUXDB_CLIENT.write_point("things", time: Time.now.to_i, values: { foo: "\\" })

事实证明这是宝石的一个错误:https://github.com/influxdata/influxdb-ruby/issues/200

在v 0.4.2中固定,我使用0.4.1

1 个答案:

答案 0 :(得分:2)

您只需使用参数化查询字符串:

INSERT INTO my_db.default.my_measurement,my_tag=1 my_val=%{1}

当你打电话时,你这样做:

influxdb.query("...query...", params: [ string ])

您所做的是通过将未转义的数据发送到查询中来创建经典injection bug。同样的原则适用于任何具有纯文本字符串表示的数据库,甚至是HTML和JavaScript等其他数据格式。