【问题标题】:Ruby on Rails 2.3 SQL LIKE queryRuby on Rails 2.3 SQL LIKE 查询
【发布时间】:2012-06-10 14:38:08
【问题描述】:

我能够在 Rails 2.3 中进行 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 查询,而且我无法在 google 上找到它,因为 LIKE 是一个通用的关键字。

有什么提示吗?我是 Rails 新手,但我有使用 Symfony 和 Django 的经验。

【问题讨论】:

  • 使用? 语法并将条件放入数组中。搜索“rails 3 like query”会返回几个匹配结果,包括 this SO question,它就是这样做的。

标签: ruby-on-rails


【解决方案1】:

这就是你想要的方式:

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

【讨论】:

  • guides.rubyonrails.org/v2.3.8/… 解释说,您不应该在此处在数组的第二部分使用字符串转义。这是您试图通过数组语法避免的部分。你想要:conditions => ['mac_address LIKE ?', @q]
【解决方案2】:

奥斯卡是正确的。一些解释。正如 Oscar 向您展示的那样,您必须使用 rails sql 查询过滤。所以你把“喜欢?”在 sql 语句和外部放置您的搜索字符串(使用 ruby​​ 代码)。 Rails 将接管并正确清理搜索字符串。

还要记住,如果您正在查询 Postgres,它默认为区分大小写的查询,但也有不区分大小写的 ilike。这让我有几次。

【讨论】: