【问题标题】:backslash at end of string causes error when inserting into InfluxDB插入 InfluxDB 时,字符串末尾的反斜杠会导致错误
【发布时间】:2018-02-14 04:40:00
【问题描述】:

我有一个字符串:

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

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

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

【问题讨论】:

标签: ruby escaping influxdb


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我正在使用github.com/influxdata/influxdb-ruby,我认为它已经对所有内容进行了消毒,但我猜不是。我已经在他们的 Github 上发表了评论,正在等待回复。
  • 他们只能清理如果您使用参数化查询功能。他们没有其他方法可以知道您在字符串中放入了什么。避免注入错误的方法是首先不注入。
  • 我想我的问题有点误导。实际上我正在做的是打电话给INFLUXDB_CLIENT.write_point("things", time: Time.now.to_i, values: { foo: "\\" })。所以我并不是真的插值自己,它是由 gem 完成的。
  • 插入 sn-p 有点切线,我的意思是更多地关注gsub 代码,该代码由标记为重复的答案解决。但是我接受了你的,因为它最终更适合我的情况。我想这有点 X/Y 问题。
  • 事实证明我没有找到错误,但这是一个错误。见github.com/influxdata/influxdb-ruby/issues/200我用的是0.4.1版本,这个bug在0.4.2修复了
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
相关资源
最近更新 更多