插入 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.
我有一个字符串:
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.