2012-06-06 131 views
1

我已經能夠做到在Rails的2.3 LIKE查詢的唯一方法是:Ruby on Rails的2.3 SQL LIKE查詢

access_points.all(:conditions => "mac_address LIKE '%#{@q}%'") 

官方文件說,這樣做的這種方式是不安全的,因爲主題到SQL注入:

將自己的條件構建爲純字符串會使您容易受到SQL注入漏洞的攻擊。例如,Client.first(:conditions =>「name LIKE'%#{params [:name]}%'」)是不安全的。請參閱下一節以獲取使用數組處理條件的首選方法。 http://guides.rubyonrails.org/v2.3.8/active_record_querying.html

不過遺憾的是它沒有解釋如何正確地做一個LIKE查詢,我一直沒能找到它在谷歌,因爲像這樣一個寬泛的關鍵字。

任何提示?我是Rails新手,但我有Symfony和Django的經驗。

+0

使用'?'語法,並把狀態在數組中。搜索「rails 3 like query」會返回幾個命中,包括[this SO question](http://stackoverflow.com/questions/4430578/how-to-do-a-like-query-in-arel-and-rails -3)的確如此。 –

回答

9

這是你想怎麼辦呢:

:conditions => ['mac_address LIKE ?', "%#{@q}%"] 
+1

http://guides.rubyonrails.org/v2.3.8/active_record_querying.html#array-conditions解釋說你不應該在這裏使用數組第二部分的字符串轉義字符串。這是你試圖通過數組語法避免的部分。你需要':conditions => ['mac_address LIKE?',@q]'來代替。 – joanwolk

1

奧斯卡是正確的。一些解釋。您必須使用rails sql查詢過濾,正如奧斯卡向您展示的那樣。所以你把「喜歡?」在sql語句和外面,把你的搜索字符串(與紅寶石代碼)。 Rails將正確接管並消毒搜索字符串。

還記得如果你正在查詢Postgres它默認爲區分大小寫的查詢,但也有一個不區分大小寫的ilike。這讓我有幾次。