Rails 注意 sql injection 漏洞

zeeler · 2012年06月02日 · 最后由 bony 回复于 2012年06月02日 · 3343 次阅读

http://www.oschina.net/news/29563/rails-sql-injection-vulnerability

https://groups.google.com/forum/?fromgroups#!topic/rubyonrails-security/dUaiOOGWL1k

Ruby on Rails 报 SQL 注入漏洞 (CVE-2012-2661),版本涉及 3.0 以及以后的版本,所影响的版本包括:

影响的版本:3.0.0 and ALL later versions 未受影响的版本:2.3.14 已修复的版本:3.2.4, 3.1.5, 3.0.13

例如使用如下的方法会受影响:

Post.where(:id => params[:id]).all

修复的方法:

将下面代码

Post.where(:id => params[:id]).all

改为

Post.where(:id => params[:id].to_s).all

目前已有补丁修复该问题,详情请看这里。

mongoid 还影响么?

to_s 做什么?to_i 就行了嘛。

呃,我只是转发一下。。。解决方案可以自己去考虑,转发的内容可能不是最佳方案

还有这么一说...

to_s 的作用主要是将 Params[:xx] 里的 hash 转化。。。 这漏洞主要问题在于,我们可以伪造别的字段查询,而非针对我们需要的字段进行查询。如下面代码:

 User.where(id: {"users.name" => 1}) 
#如果没问题的话,发送的SQL语句应为
SELECT `users`.* FROM `users` WHERE `id`.`users.name` = 1 
#而在未修复此BUG时,会产生这样的SQL语句
SELECT `users`.* FROM `users` WHERE `users`.`name` = 1

#1 楼 @huobazi 只是 ActiveRecord 的,而且从 3.2.3 以后就修复了

从来不直接把 params 直接往查询里丢。
一直奉行“宁可费事,不要出事。”

需要 登录 后方可回复, 如果你还没有账号请 注册新账号