Как дезинфицировать параметры формы для использования с Searchlogic?[Rails] - PullRequest
2 голосов
/ 06 сентября 2010

Пример формы

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

2 голосов
/ 06 сентября 2010

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 и для достижения этой же функциональности.

1 голос
/ 08 декабря 2010

Взгляните на meta_search - в частности, на методы attr_searchable и assoc_searchable.Это (почти) прямая замена Searchlogic, и она также работает с Rails 3.

...