活动记录 3.2.10 中基于动态属性的查找器

dynamic attribute based finders in active record 3.2.10

我是一名安全爱好者,也是 RoR 的菜鸟。现在我遇到了这个博客,内容是关于 SQL 在带有 Active Records 的 RoR 中注入。

SQLi in RoR Active Records

然而,博客本身可以追溯到 2013 年 1 月。尽管如此,我还是尝试在 Rails 4.2 和 ActiveRecord 4.2 的测试环境中复制 SQLi。

我尝试使用:

User.find_by_name("kotori", :select => "id, name")

来自上面的博客,但我收到以下错误:

ArgumentError: wrong number of arguments (2 for 1)

思考过程: 由于该博客已经很老了,根据我的测试设置,它可能是一个已弃用的功能。 现在博客是从 1 月 13 日开始的,所以我从 here 获取了 2012 年 12 月的活动记录构建,认为上面的代码片段至少在这个版本中肯定可以工作,但错误是一样的。 此外,我还尝试浏览相同 here 的文档,但这也没有提供对相关代码片段的任何见解。

现在我在这里错过了什么?是上面提到的博客本身不可信还是真的很蠢:)

find_by_name 只需要一个参数,那就是您要查找的对象的 name。它会 return 你一个 ActiveRecord 对象,你可以在上面调用其他方法。

其他:find_by_name 只有 return 一条记录,因此您可以:

User.where(name: 'kotori').pluck(:id, :name)

注意:由于 find_by_name return 是一个实例,因此您不能调用 pluck

我很确定 :select => "id, name" 选项最后一次出现是在 Rails 2.3 中,那是几年前的事了。社区对 2.3 的支持(以及任何安全修复)大约在 3 年前结束,几乎与撰写参考文章的时间相同,当时 Rails 4.0 发布。

该信息不仅在当时广为人知,而且在文章发表前 3 年多已经从 Rails 3.0 中删除。因此,作者使用了一些非常过时的信息来支持这篇文章。那时肯定还有站点 运行 2.3,因为仍然有(请参阅此 )。在阅读这篇文章时,它基本上是事实;但是,它使用快速老化的信息来提出关键点,但实际上并没有这样识别它。

回到现代。您仍然可以实现相同的目标,但现在需要不同的方法。 pluck 将允许您高效地 select 特定列(例如,仅 idname 字段),如下所示:

User.where(name: 'kotori').pluck(:id, :name)

这将生成优化的 SQL 语句,此外,由于没有 SQL 片段传递给查询引擎,因此没有机会进行 SQL 注入。一段时间以来,安全一直是 Rails 社区的首要任务,这是一件好事。