Ruby on rails SQL注入和ActiveRecord

Ruby on rails SQL注入和ActiveRecord,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,这对SQL注入安全吗: Guest.where(:event_id => params[:id]) Model.where("event_id = #{params[:id]}") 我正在发送params[:id]而没有进行任何类型的消毒 一般来说,所有这些activerecord方法都是安全的吗?(如其中,连接,等等) 如果不是,那么什么是确保安全的最佳做法?另外,请问我是否有任何需要注意的注意事项/边缘情况 谢谢是的,您的代码在数据库上运行之前会被安全地清除。Rails通过自动清

这对SQL注入安全吗:

Guest.where(:event_id => params[:id])
 Model.where("event_id = #{params[:id]}")
我正在发送
params[:id]
而没有进行任何类型的消毒

一般来说,所有这些activerecord方法都是安全的吗?(如
其中
连接
,等等)

如果不是,那么什么是确保安全的最佳做法?另外,请问我是否有任何需要注意的注意事项/边缘情况


谢谢

是的,您的代码在数据库上运行之前会被安全地清除。Rails通过自动清理输入来防止sql注入

例外情况是字符串插值:

Guest.where("event_id = #{params[:id]}") # NEVER do this
请改用以下两个选项之一:

Guest.where(:event_id => params[:id]) # if you want pure ruby, use this
# OR
Guest.where("event_id = ?", params[:id]) # if you prefer raw SQL, use this

查看以获取与sql注入以及其他常见攻击相关的更多信息。

所有ActiveRecord的查询构建方法,如
where
group
order
等,只要不传递原始sql字符串,就可以安全地抵抗sql注入。这易受SQL注入的影响:

Guest.where(:event_id => params[:id])
 Model.where("event_id = #{params[:id]}")
当您将字符串传递给这样的查询生成方法时,该字符串将直接插入到生成的SQL查询中。这有时很有用,但确实会增加注入漏洞的危险。另一方面,当传递值的散列时,如下所示:

 Model.where(event_id: params[:id])

…然后AR会自动为您引用值,保护您免受SQL注入的影响。

如果您确实需要使用原始SQL,可以使用来防止SQL注入

下面是一个复制自的示例


在这里的第二个选项中,rails是否会清理参数[:id]?针对SQL注入的唯一真正防御措施是真正的参数化查询。清理只能捕获有限数量的情况,而参数化根本没有这个问题-参数在驱动程序(例如ODBC)级别作为不同的数据块传递,它们从来都不是脚本的一部分。卫生处理和引用仅适用于workarounds@PanagiotisKanavos如果能添加一个关于如何使用ActiveRecord实现参数化查询的链接,那就太好了!使用字符串插值时,sql注入是高引号的,不能防止sql注入。使用参数化查询可以做到这一点——就像在DB(ODBC或其他)驱动程序级别传递的实际参数一样,不编写调用DB使用的任何语句执行的SQL脚本。v4 SQL Server适配器至少易受此错误的影响。对于参数化查询,不允许引用necessary@PanagiotisKanavos,谢谢你的评论。我回答的要点是,当您使用ActiveRecord的查询构建方法(如第二个示例中所示)时,它应该构建一个不可能进行SQL注入的查询。如果不是这样,您应该在ActiveRecord bug跟踪器上打开一个记录单。查询生成是由适配器执行的,而不是ActiveRecord本身。这个特定的适配器实际上创建了一个SQL字符串,在执行动态SQL字符串之前声明并分配参数——将注入点从查询本身移动到参数分配。当最终用户输入诸如@PanagiotisKanavos之类的表情符号时,这会导致有趣的失败,ActiveRecord的内部组件实际上构建了与OP的问题无关的查询。最终用户应该能够使用AR从数据库中获取数据,而不会有SQL注入的危险,只要他们使用本答案中推荐的样式。如果不是这样,那么AR bug tracker是提出问题的正确地点,而不是在这里。有关
的一些有用的阅读资料。订购
此处: