SQLi 安全吗?使用 OR 的多个 .where 请求

SQLi safe? Multiple .where request using OR

使用 Rails 5. 这安全吗,或者这个查询是否可以被 SQL 注入?

(我的网站上有一个用于选择 region_ids 的表格)

results = results.joins(:regionmemberships).where("regionmemberships.region_id = ? OR regionmemberships.region_id = ?", 0, 2)   if region_id.present?

我读过 results.where('regionmemberships.region_id = ?', region_id)

.. 是安全的。但是,当使用 OR 时,第一个语句是否也安全?

或者有更安全的写法吗?

安全吗?嗯,它比:

更安全
"regionmemberships.region_id = #{ params[:region_id] }
 OR regionmemberships.region_id = #{ params[:other_id] }"

因为它使用参数化查询来防止 SQL 注入。但是,您不需要首先从字符串构造 SQL:

results.joins(:regionmemberships)
       .where(regionmemberships: { region_id: params[:region_id] })

您还可以使用数组,其中:

results.joins(:regionmemberships)
           .where(regionmemberships: { region_id: [1,2,5] })

它会生成:

WHERE regionmemberships.region_id IN (1,2,5)

哪个比使用 OR 更好。

SELECT c.*, COUNT(m.cid) AS count FROM councils AS c LEFT JOIN membership AS m ON c.id = m.cid GROUP BY c.id