2

示例表格

<% 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

在这种情况下,清理参数的最佳方法是什么?用户可以轻松修改 HTML 或 GET 请求字符串,以尝试访问他们不应访问的其他数据。

4

2 回答 2

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 以实现相同的功能。

于 2010-09-06T19:28:53.730 回答
1

Take a look at meta_search -- specifically the attr_searchable and assoc_searchable methods. This is (almost) a direct replacement for Searchlogic, and it also works with Rails 3.

于 2010-12-08T17:41:19.613 回答