如何在活动记录where子句中使用通配符,同时防止sql注入

mke*_*are 18 activerecord ruby-on-rails

从rails活动记录查询指南sql注入

这段代码非常可取:

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

这段代码:

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

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

User.where("first_name LIKE '%#{first_name}%'") 
Run Code Online (Sandbox Code Playgroud)

哪个易受sql注入攻击,但如果我这样做:

User.where("first_name LIKE '%?%'", first_name)
Run Code Online (Sandbox Code Playgroud)

然后生成的sql看起来像:

SELECT "users".* FROM "users"  WHERE (first_name LIKE '%'michael'%')
Run Code Online (Sandbox Code Playgroud)

由于额外的单引号而无效.

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

Ros*_*oss 29

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

User.where("first_name LIKE (?)", "%#{first_name}%")
Run Code Online (Sandbox Code Playgroud)

  • 这是否容易受到SQL注入攻击或者Rails是否会对其进行清理? (9认同)
  • 使用`?`将像预处理语句一样工作,因此参数被清理.使用`%`或`_`不会启用SQL注入. (3认同)