【问题标题】:ActiveRecord complex where clause without sql injection [duplicate]没有sql注入的ActiveRecord复杂where子句[重复]
【发布时间】:2018-10-17 14:39:23
【问题描述】:

我正在为我的网站构建搜索,并尝试通过将搜索查询拆分为字词,然后按子类别或简短描述进行搜索:

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 INJECTION?

【问题讨论】:

  • 不确定您的查询,但 SQL(所有类型)中的一件事应该让您在 where 子句中说 where 1 = 1(然后您可以避免检查where 子句已经是因为你强迫它在那里有一些东西然后每个新语句都只是放置 AND 条件。节省大量额外的逻辑来查看你的 where 子句中是否已经有东西
  • 在 SQL 中尝试 LIKE ?,然后在 Ruby 代码中尝试 .where(whereQuery, *terms),其中 terms 是带有通配符的字符串数组:"%#{searchTerm}%"
  • 另外,SQL 语句总是大写是一个非常好的风格规则,例如ANDLIKE。当您使用多种语言时,这有助于提高可读性......

标签: sql ruby-on-rails activerecord sql-injection


【解决方案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)

【讨论】:

  • 您忘记了通配符 %。编辑你的答案,否则它是迄今为止最好的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多