rails mysql 正则表达式输入未正确清理
rails mysql regex input not getting sanitized properly
我正在 rails 3 应用程序
上执行以下操作
def test(str)
User.where("name REGEXP ?",str).last
end
使用上面的格式,rails 通常会处理输入的清理。然而,它在少数情况下会失败。
如果我使用
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
。不过,它可能会否定使用 Regexp 的目的:
对于MySQL:
def test(str)
User.where("name REGEXP ?", Regexp.escape(str) ).last
end
对于 Postgres:
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\("
我正在 rails 3 应用程序
上执行以下操作def test(str)
User.where("name REGEXP ?",str).last
end
使用上面的格式,rails 通常会处理输入的清理。然而,它在少数情况下会失败。
如果我使用
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
。不过,它可能会否定使用 Regexp 的目的:
对于MySQL:
def test(str)
User.where("name REGEXP ?", Regexp.escape(str) ).last
end
对于 Postgres:
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\("