24

来自rails active record querying guide on sql injection

此代码非常可取:

Client.where("orders_count = ?", params[:orders])

到这段代码:

Client.where("orders_count = #{params[:orders]}")

我的问题是我想使用带有通配符的 LIKE 子句。我的旧查询看起来像这样 -

User.where("first_name LIKE '%#{first_name}%'") 

哪个容易受到 sql 注入的影响,但如果我这样做:

User.where("first_name LIKE '%?%'", first_name)

然后生成的 sql 如下所示:

SELECT "users".* FROM "users"  WHERE (first_name LIKE '%'michael'%')

由于额外的单引号,这是无效的。

使用通配符和 LIKE 子句的最佳方法是什么,同时还可以防止 sql 注入攻击?

4

2 回答 2

37

您应该像这样修改您的查询

User.where("first_name LIKE (?)", "%#{first_name}%")
于 2012-11-23T13:19:20.810 回答
2

更新:Rails 对此进行了一些改进。

Arel 允许您使用简单的 DSL 构建查询,作为奖励,它包含在 ActiveRecord 中。这是您的用例的示例。

User.where(User.arel_table[:first_name].matches("%#{first_name}%"))

ILIKE这将使用而不是进行不区分大小写的搜索LIKE

还要注意的是,Arel 是 Rails 内部的,并且故意不被框架公开。

于 2019-09-06T14:55:56.427 回答