0

我是一名安全爱好者,也是 RoR 的菜鸟。现在有一个我遇到的关于在 RoR 中使用 Active Records 进行 SQL 注入的博客。

RoR 活动记录中的 SQLi

然而,博客本身可以追溯到 2013 年 1 月。不过,我尝试在带有 Rails 4.2 和 ActiveRecord 4.2 的测试环境中复制 SQLi。

我尝试使用:

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

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

ArgumentError:参数数量错误(2 比 1)

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

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

4

2 回答 2

1

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

其他事情:find_by_name只返回一条记录,所以你可以这样做:

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

注意:由于,find_by_name返回一个实例,你不能调用pluck它。

于 2016-05-06T07:49:56.450 回答
1

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

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

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

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

这将生成优化的 SQL 语句,此外,由于没有 SQL 片段传递给查询引擎,因此没有 SQL 注入的机会。很长一段时间以来,安全性一直是 Rails 社区的头等大事,这是一件好事。

于 2016-05-06T09:29:44.080 回答