在遵循了有关转义撇号的一些提示后,我在生成的sql语句中得到了一个意外的转义字符组合。以下rails 4活动记录语句针对5.5.42-MariaDB运行:
User.where(["surname LIKE ?", "%#{params[:search]}%"])
哪里
params[:search] = "O'Keefe"
.to_sql
生成
SELECT * FROM users WHERE surname LIKE '%O\\'Keefe%'
MySQL / MariaBD希望将撇号作为两个单撇号''
进行转义,或者使用单个反斜杠\'
进行转义,这样会导致语法错误。我正在寻求帮助,以了解为什么两个反斜杠\\'
出现,以及一个将保持防止SQL注入的解决方案。
更新
根据以下建议进行进一步调查后,似乎控制台.to_sql
输出SELECT * FROM users WHERE surname LIKE '%O\\'Keefe%'
不是传递给MySQL的内容。它失败了'因为我只是将语句复制到mysql控制台来测试执行。在到数据库的路径上有一些黑魔法,它将双反斜杠\\'
转换为有效的mysql转义序列。
所以问题1/2解决了
User.where(["surname LIKE ?", "%#{params[:search]}%"])
是正确自动转义用户输入字符串的有效语法。但是,任何人都可以了解产生双反斜杠的原因以及在数据库执行过程中如何修改它?
答案 0 :(得分:1)
试试这个:
User.where(["surname LIKE ?", "%#{params[:search].gsub("'", "''")}%"])
http://dev.mysql.com/doc/refman/5.0/en/string-literals.html#character-escape-sequences