【发布时间】: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 语句总是大写是一个非常好的风格规则,例如
AND和LIKE。当您使用多种语言时,这有助于提高可读性......
标签: sql ruby-on-rails activerecord sql-injection