Ruby on rails 发布空数组是不安全的?为什么?

Ruby on rails 发布空数组是不安全的?为什么?,ruby-on-rails,Ruby On Rails,我在rails日志中注意到,如果有一个空数组的帖子,它会说: **attribute** was set to nil, because it was one of [], [null] or [null, null, ...]. Go to http://guides.rubyonrails.org/security.html#unsafe-query-generation for more information. 当阅读在该url和部分找到的文章时,他们给出了以下示例: 由于活动记录结合

我在rails日志中注意到,如果有一个空数组的帖子,它会说:

**attribute** was set to nil, because it was one of [], [null] or [null, null, ...]. Go to http://guides.rubyonrails.org/security.html#unsafe-query-generation for more information.
当阅读在该url和部分找到的文章时,他们给出了以下示例:

由于活动记录结合 Rack解析可能发出的查询参数的方式 具有IS NULL where子句的意外数据库查询。作为回应 针对该安全问题CVE-2012-2660、CVE-2012-2694和 CVE-2013-0155 deep_munge法作为一种保持 默认情况下,Rails是安全的

攻击者可能使用的易受攻击代码示例,如果 未执行的深层次检查是:

Ok-对于他们的示例,假设params[:token]=[]

因此:

这将触发:

User Load (0.5ms)  SELECT  "users".* FROM "users"  WHERE 1=0 LIMIT 1
它不返回任何用户。。。因此,下一步:

user.reset_password!
与以下内容相同:

nil.reset_password!


那么这个例子中的安全漏洞在哪里呢?

我肯定有很多例子,但其中一个可能是:

假设params[:foo]是[null,null,…],那么您可以有如下代码:

params.each do |foo|
  User.where(foo: foo)…
end
这将导致某些SELECT*来自用户,其中foo为NULL,这可能不是您想要的


我没有看过,但我想可能会有一些关于为什么的深入博客帖子…

在示例中,作者检查了一个nil标记:除非params[:token]。nil?然后调用User.find_by_令牌,假设他们已经防范了nil案例


不幸的是,如果params[:token]是空的而不是nil,那么find_by_令牌仍然会执行,并返回第一个用户一个nil令牌。查询类似于SELECT users.*FROM users,其中token为NULL LIMIT 1。我不确定1=0是从哪里来的。

我把它放在控制台中得到的。。。User.where:token=>[]。to_sql=>SELECT\users\.*FROM\users\where 1=0。。。和User.find_by_token[]=>用户加载0.5ms选择用户。*从1=0的用户中限制1。。。这两条语句实际上都不会返回用户,因此我认为rails指南中的示例是假的。但是,user.find_by_token[nil]可以:从users.token为NULL LIMIT 1的用户中选择users.*,因此我得到了。。我只是不明白空数组的情况。
nil.reset_password!
NoMethodError: undefined method `reset_password!' for nil:NilClass
params.each do |foo|
  User.where(foo: foo)…
end