2015-04-17 135 views
3

我用在我的项目squeel gem,我有一些代码是这样的:可能的SQL注入

def self.search(query) 
    return self.scoped if query.blank? 

    self.joins(:supplier).where{lower(supplier.supplier_name).like_any(["%#{query}%"])} 
    end 

我的问题是这样的代码容易受到SQL注入?我该如何解决它?我试图做sanitize(query),但它只是增加了引号的额外集和SQL语句没有得到适当地产生

+0

这是从续集?看起来它可能来自Squeel gem,而不是:https://github.com/activerecord-hackery/squeel - 请澄清一下,因为漏洞或不注册SQL将取决于哪个库。我怀疑它不是脆弱的,但这些库中的大多数都小心翼翼地逃避了用于查询的参数。 –

+0

@NeilSlater你是对的,让我编辑这个问题,随时回答谢谢 –

+1

好吧,我可以回答,如果它是续集。 。 。但我没有设置ActiveRecord数据库,并且不确定,但我怀疑你的代码不易受到攻击。希望有一个更好的人会更有信心地回答。 –

回答

1

更新:

Squeel会自动跳脱字符串,所以您的查询是好的,不会打开你注射。见question about sql injection - Squeel - Github

OLD(不正确)答案: 这是活动记录的版本

有人纠正我,如果我错了,而是因为你是在传递#{查询}为一个字符串,不是一个论点,那么你正打开自己的注射。见the docs for passing in arguments

使用参数将难逃 '查询' STRING

你的查询中使用参数:

self.joins(:supplier).where{lower(supplier.supplier_name).like_any(["%"+?+"%"], query)}