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

backslash at end of string causes error when inserting into InfluxDB

我有一个字符串:

string = "\"
puts string
# => \

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

例如,如果我将以下内容传递给 Influx,它将导致 "unterminated string" 错误:

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: "\" })

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

它已在 v 0.4.2 中修复,我使用的是 0.4.1

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

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

当你调用它时,你会这样做:

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

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