Как санировать параметры формы для использования с 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.

Другие вопросы по тегам