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 就是用占位符进行查询吧
Possible SQL injection的意思是潜在的 SQL 注入漏洞,提示你注意一点儿,像这种机器分析程序很难智能到根据实际情况去判断是否有漏洞。。
单就 Brakeman 的检查来说,我觉得可以判定为 false positive, 动态语言还是太动态了,不容易查。但实际上这里还是存在隐患。
关键点在于:Hash Value 不一定是字符串。类似 #8 楼 给的链接那种情况。这个 Value 可能是 Hash 或 Array~ 直接拿去查询时就可能出现问题。
如果在用 ActiveRecord, 那么攻击者暴力破解时就可以用 Array 值来批量尝试 password.
其他 ORM 如果允许 Hash value 影响查询行为,那么问题就更严重。MongoMapper 看上去是存在这个问题的,不知道他们采取了什么措施没。