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

Posted

技术标签:

【中文标题】在 Rails 中使用子字符串查询安全的方式【英文标题】:Using substring in Rails query the safe way 【发布时间】:2015-05-07 18:47:05 【问题描述】:

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

我的查询类似于以下内容(基于此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】:

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

【讨论】:

问题是当我附加selectgroup 方法时,我手头上没有模型。除非有办法找出具有 ActiveRecord 查询的模型,否则我认为这不符合我的要求。 最后attribute_names 也为ActiveRecord::Relation 工作。我会将此标记为正确答案。

以上是关于在 Rails 中使用子字符串查询安全的方式的主要内容,如果未能解决你的问题,请参考以下文章

Rails Activerecord 关系:使用子查询作为 SQL 选择语句的表

MySQL 从使用 UDF 的子查询中截断字符串

Laravel Eloquent 中的 SQL 查询子字符串

如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?

XCTest - 如何在导航栏标题中查询子字符串

如何在 SQL 子查询中获取字符串数组