【问题标题】:How to sanitize form params for use with Searchlogic? [Rails]如何清理表单参数以与 Searchlogic 一起使用? [导轨]
【发布时间】:2010-09-06 18:13:21
【问题描述】:

示例表格

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

【问题讨论】:

    标签: ruby-on-rails sanitization searchlogic


    【解决方案1】:

    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 来实现同样的功能。

    【讨论】:

      【解决方案2】:

      看看meta_search -- 特别是 attr_searchable 和 assoc_searchable 方法。这(几乎)是 Searchlogic 的直接替代品,它也适用于 Rails 3。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-09
        • 2010-12-06
        • 2011-07-26
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多