Rails 为什么这里有 sql 注入的漏洞呢?

fsword · 2012年10月15日 · 最后由 fsword 回复于 2012年10月16日 · 3580 次阅读

controller 里面的代码

Machine.where(params.slice(:host, :name, :user))

但是 brakeman 提示

"warning_type": "SQL Injection", "message": "Possible SQL injection", "link": "http://brakemanscanner.org/docs/warning_types/sql_injection/",

我不理解,params 经过 slice 是一个 hash,对 where 来说,传一个 hash 就是用占位符进行查询吧

params.slice(:host, :name, :user) 出来是什么?

Possible SQL injection的意思是潜在的 SQL 注入漏洞,提示你注意一点儿,像这种机器分析程序很难智能到根据实际情况去判断是否有漏洞。。

#1 楼 @itsvoid 是个 hash #2 楼 @hooopo 我觉得奇怪的是,这里显然不可能有漏洞,因为是直接用占位符的方式进行传参的

以前某些版本传 hash 会注入,不知道有没有关系

#3 楼 @fsword 你用 Rails 4 了么?

Machine.where(params.slice(:host, :name, :user).untaint) 这样呢?

#5 楼 @bhuztez 不是,是 rails3 #6 楼 @jjym 还是一样

是不是因为这个帖子里的问题 http://ruby-china.org/topics/3606

#8 楼 @zhangyuan 不确定,我的 rails 版本是 3.2.6

#7 楼 @fsword Rails 3 必须的啊

#10 楼 @bhuztez 不懂,能构造一个攻击示例么?

Brakeman 是用静态代码检查的,它无法知道你在 where 里面调用返回是什么类型,所以会给一个警告,忽略掉即可。

#11 楼 @fsword Rails 3 是框架自己 escape 的,很容易就引入潜在被注入的风险了

单就 Brakeman 的检查来说,我觉得可以判定为 false positive, 动态语言还是太动态了,不容易查。但实际上这里还是存在隐患。

关键点在于:Hash Value 不一定是字符串。类似 #8 楼 给的链接那种情况。这个 Value 可能是 Hash 或 Array~ 直接拿去查询时就可能出现问题。

如果在用 ActiveRecord, 那么攻击者暴力破解时就可以用 Array 值来批量尝试 password.

其他 ORM 如果允许 Hash value 影响查询行为,那么问题就更严重。MongoMapper 看上去是存在这个问题的,不知道他们采取了什么措施没。

#12 楼 @quakewang 项目中是自动检查的,所以要明确一下这个到底能不能忽略 #13 楼 @bhuztez 收到 #14 楼 @5long 有些明白了,Array 这个例子有帮助

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