如何清理用于Searchlogic的表格参数? [滑轨]

时间:2010-09-06 18:13:22

标签: ruby-on-rails sanitization searchlogic

示例表格

<% form_for @search do |f| %>
  <ul>
    <li>
      <%= f.label :item_number_equals, "Item number" %><br />
      <%= f.text_field :item_number_equals %>
    </li>
    <li>
      <%= f.label :description_keywords, "Description" %><br />
      <%= f.text_field :description_keywords %>
    </li>
    <li>
      <%= f.check_box :in_stock %>
      <%= f.label :in_stock, "In Stock?" %>
    </li>
    <li>
      <%= f.label :price_gte, "Price Min" %>
      <%= f.text_field :price_gte, :size => 3 %> 
      <%= f.label :price_lte, "Max" %>
      <%= f.text_field :price_lte, :size => 3 %>
    </li>
    <li>
      <%= f.submit "Search" %>
    </li>
  </ul>
<% end %>

控制器

# app/controllers/products_controller.rb
class ProductsController < ApplicationController

  def index
    @search = Product.search(params[:search])
    @products = @search.all
  end

end

在这种情况下,对params进行消毒的最佳方法是什么?用户可以轻松修改HTML或GET请求字符串,以尝试访问他们无权访问的其他数据。

2 个答案:

答案 0 :(得分:2)

AFAIK,Searchlogic不支持开箱即用的任何类型的可搜索范围的白名单。最简单的方法是编写一个方法来删除任何未明确授权的散列键:

class Hash
  def sanitize_keys!(*allowed)
    self.each do |key, value|
      self.delete(key) unless allowed.include? key
    end
  end
end

# in your controller...
params[:search].andand.sanitize_keys!(:in_stock, :price_gte) # etc...

不是很好,但也不错,而且肯定会完成工作。在使用meta_search的Rails 3中,您可以将范围列入白名单以便在模型级别进行搜索,这是一种更好的方法。您可以扩展Searchlogic以实现相同的功能。

答案 1 :(得分:1)

查看meta_search - 特别是attr_searchable和assoc_searchable方法。这(几乎)是Searchlogic的直接替代品,它也适用于Rails 3。