在Rails中使用子字符串查询安全方式

时间:2015-03-06 07:35:41

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

我正在编写一个查询,在表格中查看一些分组结果,以便构建按字母顺序排列的分页索引。

我看到的查询类似于以下内容(基于此answer):

criteria = "substr(%s, 1, 1)" % field_name
Posts.select(criteria).group(criteria).order(criteria).count(:id)

现在我想改进这个查询以避免任何SQL注入,但我真的找不到一种方法来清理它。

据我所知,这个特定查询无法使用LIKE - 或者至少我没有找到它 - 并使用where子句。

现在示例正在使用Posts实体,但在生产中它将与许多类型的对象一起使用,我希望有一个通用系统来动态指定字段名称。

我唯一的想法就是获取表列名称并在继续之前根据该列表验证字段,尽管这可能在生产场景中过度使用。

我拥有的环境是Ruby 1.9.3,Rails 3.2.17和MySQL数据库。

更新1

我会更好地定义上下文:在上面的查询中我使用的是Post但我真正拥有的是一个ActiveRecord查询,我在追加selectgroup标准。

类似的东西:

query = Post.where(:condition => something)
# .. do more stuff here

criteria = "substr(%s, 1, 1)" % field_name
query.select(criteria).group(criteria).order(criteria).count(:id)

1 个答案:

答案 0 :(得分:0)

使用Post.attribute_names获取Post模型列,然后检查列是否包含field_name,如果不包含,则会引发错误。