2012-06-06 48 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。这让我有几次。