Rails Postgres查询hstore以避免SQL注入

时间:2016-01-08 00:52:28

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

我的班级Userhstore属性:preferences。如果我想查找其偏好设置为startpage nil的所有用户,我可以这样做:

User.where("preferences @> 'startpage=>NULL'")

如何构造该查询以避免SQL查询注入?

试过:

User.where("preferences @> :key '=>NULL'", key: 'startpage')
User.where("preferences @> :key IS 'NULL'", key: 'startpage')
User.where("preferences @> :key IS NULL", key: 'startpage')
User.where("preferences @> ? IS NULL", 'startpage')

没有运气。有谁知道怎么做?

1 个答案:

答案 0 :(得分:1)

@>运营商期望双方都有hstores。当你说:

some_hstore @> 'startpage=>NULL'

PostgreSQL将隐式添加::hstore演员,就像你说的那样:

some_hstore @> 'startpage=>NULL'::hstore

但是还有其他方法可以创建一个hstore。来自fine manual

  

功能:hstore(text, text)
  退货类型:hstore
  描述:制作单项hstore

所以你可以切换到更明确的hstore(text, text)函数,让ActiveRecord用占位符和字符串做正常的事情:

User.where("preferences @> hstore(:key, null)", :key => 'start page')