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

时间:2016-05-06 07:47:47

标签: ruby-on-rails activerecord sql-injection dynamic-finders

安全爱好者和RoR的总菜鸟。现在有一个关于在RoR中使用Active Records进行SQL注入的博客。

SQLi in RoR Active Records

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

我尝试使用:

$('#langtabs span.active').each(function(){
        alert("d");
        var lang=$(this).text();
        select_lang+=','+lang;
});

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

  

ArgumentError:参数数量错误(2表示1)

思考过程: 由于博客很老,根据我的测试设置,它可能是一个不推荐使用的功能。 现在博客是从1月13日开始的,所以我从2012年12月开始从here开始考虑上面的代码片段至少在这个版本中起作用,但错误是相同的。 此外,我还尝试浏览相同here的文档,但这也没有深入了解相关代码段。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

注意:由于find_by_name会返回一个实例,因此您无法在其上调用pluck

答案 1 :(得分:1)

我很确定:select => "id, name"选项最近几次出现在Rails 2.3中。 2.3的社区支持(以及任何安全修复)在大约3年前结束,与Rails 4.0发布时编写引用文章的时间几乎相同。

这些信息不仅在当时非常有名,而且在文章发布前3年已经从Rails 3.0中删除了。因此,作者使用了一些非常明显过时的信息来支持这篇文章。肯定还有网站运行2.3,因为还有(见SO question from yesterday)。在阅读这篇文章时,它基本上是事实;然而,它使用快速老化的信息来制作关键点,但实际上并没有将其识别出来。

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

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

这将生成一个优化的SQL语句,而且,由于没有传递给查询引擎的SQL片段,因此没有SQL注入的机会。在很长一段时间内,安全性一直是Rails社区的首要任务,这是一件好事。