【问题标题】:ActiveRecord: SQL injection resistant wheresActiveRecord:抗 SQL 注入的 wheres
【发布时间】:2011-06-19 22:14:24
【问题描述】:

我正在尝试构建一个微型引擎,该引擎允许通过用户输入动态构建搜索查询。我在参数中得到了列名和搜索字符串,我们假设:

params = {:filter_column => "column_name", :filter_string => "search term"}

我知道,如果我只是在我的模型上调用标准类型的位置,它会是:

ModelName.where("column_name LIKE ?", params[:filter_string])

我遇到的问题是我正在尝试编译我的过滤器列表,然后一次将它们应用于搜索。我可以在调用 where 方法之前建立 where 字符串吗?

我试过了:

ModelName.where("? LIKE ? ", column_name, search_term)

运气不佳。有任何提示、提示或指示吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord sql-injection


    【解决方案1】:

    您可能想尝试使用 Metawhere Gem 的解决方案

    我在想这样的事情:

    Model.where(params[:filter_column].intern.matches => params[:filter_string])
    

    您可以按照自己的条件按顺序构建每一个,用逗号分隔或随后调用 where。

    【讨论】:

    • 这对我有用。允许更细粒度的控制是必不可少的。另外,我觉得输入任何 sql 有点脏……在这种情况下是“LIKE”……
    • 是的,我在自己的代码中没有使用足够多的 metawhere,但即使对于小事情它也非常棒。同一个人最近还推出了“squeel”,这似乎是一种进化——还没有看过它,但仅供参考。
    【解决方案2】:

    只要你能改变column_name的内容(即没有被注射的风险)使用就没有坏处

    ModelName.where("`#{column_name}` LIKE ?", search_term)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多