安全爱好者和RoR的总菜鸟。现在有一个关于在RoR中使用Active Records进行SQL注入的博客。
然而,博客本身的历史可以追溯到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的文档,但这也没有深入了解相关代码段。
现在我在这里失踪了什么?上面提到的博客本身是不值得信赖的,还是真的很愚蠢:)
答案 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
允许您有效地选择特定列(例如,仅id
和name
字段),如下所示:
User.where(name: 'kotori').pluck(:id, :name)
这将生成一个优化的SQL语句,而且,由于没有传递给查询引擎的SQL片段,因此没有SQL注入的机会。在很长一段时间内,安全性一直是Rails社区的首要任务,这是一件好事。