<% 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请求字符串,以尝试访问他们无权访问的其他数据。
答案 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。