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

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

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就是用占位符进行查询吧

共收到 15 条回复

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这个例子有帮助

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