rails mysql正则表达式输入未正确清理

rails mysql正则表达式输入未正确清理,mysql,ruby-on-rails,ruby,ruby-on-rails-3,Mysql,Ruby On Rails,Ruby,Ruby On Rails 3,我正在rails 3应用程序上执行以下操作 def test(str) User.where("name REGEXP ?",str).last end 使用上述格式,rails通常处理输入的清理。然而,它在少数情况下失败 如果我使用 str = "hi\\" str="hi(" 我得到这个错误:- ActiveRecord::StatementInvalid: Mysql2::Error: Got error 'trailing backslash (\)' from regex

我正在rails 3应用程序上执行以下操作

def test(str)
    User.where("name REGEXP ?",str).last
end
使用上述格式,rails通常处理输入的清理。然而,它在少数情况下失败

如果我使用

str = "hi\\"
str="hi("
我得到这个错误:-

ActiveRecord::StatementInvalid: Mysql2::Error: Got error 'trailing backslash (\)' from regexp: SELECT  `users`.* FROM `users`  WHERE (name REGEXP 'hi\\') ORDER BY `users`.`id` DESC LIMIT 1
如果我使用

str = "hi\\"
str="hi("
我得到这个错误

ActiveRecord::StatementInvalid: Mysql2::Error: Got error 'parentheses not balanced' from regexp: SELECT  `users`.* FROM `users`  WHERE (name REGEXP 'hi(') ORDER BY `users`.`id` DESC LIMIT 1
对于类似str=“hi”的情况,它可以工作:-

在regexsql中执行输入之前,是否有干净的rails方法来处理输入?

Safe variant 你可以用。它可能会否定使用Regexp的目的,但是:

对于MySQL:

def test(str)
  User.where("name REGEXP ?", Regexp.escape(str) ).last
end
对于博士后:

def test(str)
  User.where("name ~ ?", Regexp.escape(str) ).last
end
在本地Postgres数据库上进行测试:

Movie.where("title ~ ?", '*')
#=> PG::InvalidRegularExpression: ERROR:  invalid regular expression: quantifier operand invalid

Movie.where("title ~ ?", Regexp.escape('*'))
#=> [Everything You Always Wanted to Know About Sex * But Were Afraid to Ask]
不安全变体 确保你的输入是正确的。伟大的力量带来伟大的责任

Movie.where("title ~ ?", 'a{2,}')
#=> [Mou gaan dou, Der Baader Meinhof Komplex, De helaasheid der dingen]

Movie.where("title ~ ?", "\\(").first
#=> (500) Days of Summer

Movie.where("title ~ ?", "[^0-9a-zA-Z \.\-]")
对于您的示例,您需要
str=“hi\\\”
str=“hi\\”(“