轨MySQL的正则表达式输入没有得到正确消毒

轨MySQL的正则表达式输入没有得到正确消毒

问题描述:

我做一个滑轨以下3个应用程序轨MySQL的正则表达式输入没有得到正确消毒

def test(str) 
    User.where("name REGEXP ?",str).last 
end 

使用上面的格式,一般轨消毒处理的输入。然而,它在少数情况下失败。

如果我使用

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(" 

我得到这个错误

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)”的情况,它的工作原理如下: -

是否存在干净的rails方式处理输入,然后在正则表达式sql中执行?

安全变形

您可以使用Regexp.escape。这可能抵消目的使用正则表达式,虽然:

对于MySQL:

def test(str) 
    User.where("name REGEXP ?", Regexp.escape(str)).last 
end 

Postgres的:一个本地的Postgres数据库

def test(str) 
    User.where("name ~ ?", Regexp.escape(str)).last 
end 

测试:

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\\("

+0

是。有效。非常感谢。 – rohan