在 Rails 中使用子字符串以安全的方式查询
Using substring in Rails query the safe way
我目前正在编写查询以查看 table 一些分组结果,以构建按字母顺序排列的分页索引。
我的查询类似于以下内容(基于此 answer):
criteria = "substr(%s, 1, 1)" % field_name
Posts.select(criteria).group(criteria).order(criteria).count(:id)
现在我想改进这个查询以避免任何 SQL 注入,但我真的找不到清理它的方法。
据我所知,没有办法对这个特定查询使用 LIKE - 或者至少我还没有找到它 - 并使用 where
子句。
现在示例使用的是 Posts
实体,但在生产中它将与多种对象一起使用,我希望有一个通用系统来动态指定字段名称。
我唯一的想法是获取 table 列名称并在继续之前根据该列表验证该字段,尽管这在生产场景中可能有点矫枉过正。
我的环境是Ruby 1.9.3,Rails 3.2.17,还有一个MySQL db。
更新 1
我会更好地定义上下文:在上面的查询中我使用 Post
但我真正拥有的是一个 ActiveRecord 查询,我在其中附加了 select
和 group
标准。
类似于:
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)
使用 Post.attribute_names
获取 Post 模型的列,然后检查列是否包含您的 field_name
,如果不包含则引发错误。
我目前正在编写查询以查看 table 一些分组结果,以构建按字母顺序排列的分页索引。
我的查询类似于以下内容(基于此 answer):
criteria = "substr(%s, 1, 1)" % field_name
Posts.select(criteria).group(criteria).order(criteria).count(:id)
现在我想改进这个查询以避免任何 SQL 注入,但我真的找不到清理它的方法。
据我所知,没有办法对这个特定查询使用 LIKE - 或者至少我还没有找到它 - 并使用 where
子句。
现在示例使用的是 Posts
实体,但在生产中它将与多种对象一起使用,我希望有一个通用系统来动态指定字段名称。
我唯一的想法是获取 table 列名称并在继续之前根据该列表验证该字段,尽管这在生产场景中可能有点矫枉过正。
我的环境是Ruby 1.9.3,Rails 3.2.17,还有一个MySQL db。
更新 1
我会更好地定义上下文:在上面的查询中我使用 Post
但我真正拥有的是一个 ActiveRecord 查询,我在其中附加了 select
和 group
标准。
类似于:
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)
使用 Post.attribute_names
获取 Post 模型的列,然后检查列是否包含您的 field_name
,如果不包含则引发错误。