没有 sql 注入的 ActiveRecord 复杂 where 子句 [duplicate]

ActiveRecord complex where clause without sql injection [duplicate]

提问人:itzikos 提问时间:5/8/2018 更新时间:5/8/2018 访问量:117

问:

我正在为我的网站构建搜索,我正在尝试通过将搜索查询拆分为术语来使用搜索查询,然后按子类别或short_description进行搜索:

whereQuery = ''
declared(params).search.downcase.split(' ').each_with_index do |searchTerm, index|
  if index != 0
    whereQuery += ' and ';
  end
  whereQuery += '(lower(short_description) like "%'+searchTerm+'%" or lower(subcategory) like "%'+searchTerm+'%")'
end
orders.where(whereQuery).order(number_of_purchases: :desc, rating: :desc)

有没有更好/更安全的方法来避免此查询的 SQL 注入?

SQL Ruby-on-Rails ActiveRecord SQL注入

评论

0赞 Brad 5/8/2018
不确定你的查询,但 SQL(所有类型)中的一件事应该让你做的是在你的 where 子句中说 where 1 = 1(然后你可以避免检查 where 子句中是否已经有东西,因为你强迫它在那里有东西,然后每个新语句都只是把 AND 条件。节省了很多额外的逻辑,以查看 where 子句中是否已经有内容
0赞 Phlip 5/8/2018
尝试在 SQL 中,然后在 Ruby 代码中,其中是一个带有通配符的字符串数组:.LIKE ?.where(whereQuery, *terms)terms"%#{searchTerm}%"
0赞 Phlip 5/8/2018
此外,始终将 SQL 语句放在 CAPITALS 中是一个非常好的样式规则,例如 和 .当您有大量语言组合时,这有助于可读性......ANDLIKE

答:

3赞 NARKOZ 5/8/2018 #1

使用 ActiveRecord 链接:

orders = Order

declared(params).search.downcase.split(' ').each do |searchTerm|
  orders = orders.where('(LOWER(short_description) LIKE ? OR LOWER(subcategory) LIKE ?', "%#{searchTerm}%", "%#{searchTerm}%")
end

orders = orders.order(number_of_purchases: :desc, rating: :desc)

评论

1赞 Phlip 5/8/2018
你忘记了通配符。编辑你的答案,否则它是迄今为止最好的......%