在 Ruby on Rails 中'Where'和'IN'以避免 SQL 注入



我正在更改现有查询以避免SQL注入。查询如下

People.select('DISTINCT people_id')
.where(person_id: id)
.where("position_id IN (#{approval_id.join(', ')})")
.where('ended_on IS NULL or ended_on > ?', Date.today)

其中approval_id是值为[1,2,3,4]的数组

当我更改查询行3 时

.where("position_id IN (#{approval_id.join(', ')})") to
.where("position_id IN ?", approval_id)

它不起作用。出了什么问题?由于approval_id是一个数组,我可以直接将其传递给IN。

传入一个数组,Rails会将其转换为in查询。

People
.select('DISTINCT people_id')
.where(
person_id: id,
position_id: approval_id, # approval_ids?
)
.where("ended_on is null or ended_on > ?", Date.today)

nil将转换为is null,您可以使用andor将其完全保留在ActiveRecord中。

People
.select('DISTINCT people_id')
.where(
person_id: id,
position_id: approval_id, # approval_ids?
)
.and(
People
.where(ended_on: nil)
.or(People.where(ended_on > ?", Date.today)
)

尽管这在这个查询中可能更复杂,但对其他人来说知道这一点很有用。

我会使用Arel而不是字符串:

people_table = People.arel_table
People
.select(:people_id)
.where(person_id: id)
.where(people_table[:position_id].in(approval_id))
.where(
people_table[:ended_on].eq(nil).or(
people_table[:ended_on].gt(Date.today)
)
).distinct

相关内容

  • 没有找到相关文章

最新更新