我在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
...
那么这个例子中的安全漏洞在哪里???
答案 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
可能不是您想要的。
我没有看过,但我想有一些深入的博客帖子就是为什么......