我有一个字符串:
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
答案 0 :(得分:2)
您只需使用参数化查询字符串:
INSERT INTO my_db.default.my_measurement,my_tag=1 my_val=%{1}
当你打电话时,你这样做:
influxdb.query("...query...", params: [ string ])
您所做的是通过将未转义的数据发送到查询中来创建经典injection bug。同样的原则适用于任何具有纯文本字符串表示的数据库,甚至是HTML和JavaScript等其他数据格式。