2015-04-17 134 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)}