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

私の知る限り、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 を拡張して、これと同じ機能を実現することもできます。

于 2010-09-06T19:28:53.730 に答える
1

meta_search、具体的にはattr_searchableメソッドとassoc_searchableメソッドを見てください。これは(ほぼ)Searchlogicの直接の代替品であり、Rails3でも機能します。

于 2010-12-08T17:41:19.613 に答える