为了防止sql注入,我这样做了:
string = "105;' DROP TABLE Suppliers"
new_string = string.gsub("'", %q(\'))
p new_string
=> "105; DROP TABLE Suppliers DROP TABLE Suppliers"
为什么输出DROP TABLE Suppliers
两次?
答案 0 :(得分:1)
Ruby将\'
解释为匹配后字符串($')的反向引用。所以,你在报价后用所有内容替换引号:
<space>DROP TABLE Suppliers
V
"105;' DROP TABLE Suppliers"
这里是对匹配前变量($`)的反向引用:
string = "105;' DROP TABLE Suppliers"
new_string = string.gsub("'", %q(\`))
p new_string
--output:--
"105;105; DROP TABLE Suppliers"
我找不到任何关于ruby全局变量的反向引用的文档,所以恭喜你是红宝石的先驱。
答案 1 :(得分:1)
好消息是,事实证明你不必这样做。欲了解更多信息,请阅读下面的评论。要逃避单引号,请添加另一个单引号。所以获胜者是:
string.gsub(/'/, "''")