【问题标题】:rails mysql regex input not getting sanitized properlyrails mysql正则表达式输入未正确清理
【发布时间】:2017-01-09 10:50:13
【问题描述】:

我在 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)" 这样的情况,它可以工作:-

在正则表达式 sql 中执行输入之前,是否有干净的 Rails 方式来处理输入?

【问题讨论】:

    标签: mysql ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    安全变体

    您可以使用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\\("

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-21
      • 2010-10-31
      • 1970-01-01
      • 2015-07-14
      • 2010-11-27
      • 2010-12-31
      相关资源
      最近更新 更多