Как санировать параметры формы для использования с Searchlogic? [Rails]
Пример формы
<% 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, пытаясь получить доступ к другим данным, к которым у него не должно быть доступа.
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...
Не очень, но не плохо, и это, безусловно, сделает работу. В Rails 3, использующем meta_search, вы можете вносить в белый список ваши области поиска для поиска на уровне модели, что является превосходным подходом. Возможно, вы могли бы расширить Searchlogic для достижения этой же функциональности.
Посмотрите на meta_search - в частности, методы attr_searchable и assoc_searchable. Это (почти) прямая замена Searchlogic, и она также работает с Rails 3.