发布一个空数组是不安全的?为什么?

时间:2016-02-04 23:20:52

标签: 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.

在阅读该网址和部分中找到的文章时,他们举例说明:

  

由于Active Record解释参数的方式   Rack分析查询参数的方式可以发布   具有IS NULL where子句的意外数据库查询。作为回应   该安全问题(CVE-2012-2660,CVE-2012-2694和   CVE-2013-0155)引入了deep_munge方法作为保持的解决方案   Rails默认是安全的。

     

攻击者可以使用的易受攻击代码的示例,如果   deep_munge未执行的是:

unless params[:token].nil?
  user = User.find_by_token(params[:token])
  user.reset_password!
end

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

所以:

User.find_by_token([])

会触发:

User Load (0.5ms)  SELECT  "users".* FROM "users"  WHERE 1=0 LIMIT 1

没有返回任何用户......所以下一个:

user.reset_password!

将与:

相同
nil.reset_password!

...

NoMethodError: undefined method `reset_password!' for nil:NilClass

...

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

2 个答案:

答案 0 :(得分:1)

在示例漏洞中,作者执行了对nil令牌的检查:unless params[:token].nil?,然后调用User.find_by_token,假设他们已经防止了nil案例。

对于他们来说不幸的是,如果params[:token]为空而不是nil,那么find_by_token仍然会执行第一个User并返回nil token。 (查询类似于SELECT "users".* FROM "users" WHERE token IS NULL LIMIT 1。我不知道你从哪里得到WHERE 1=0。)

答案 1 :(得分:0)

我确信有大量的例子,但有一个可能是:

假设params[:foo][null, null,...],那么您可以使用以下代码:

params.each do |foo|
  User.where(foo: foo)…
end

这会导致某些SELECT * FROM users where foo IS NULL可能不是您想要的。

我没有看过,但我想有一些深入的博客帖子就是为什么......